用於顯式加載引用和集合的EF Core helper方法

c# entity-framework entity-framework-core lambda reflection

EF Core支持顯式加載 。上下文有兩個重載,一個用於引用,一個用於集合。

有兩種方法是沒用的,並且變得混亂。我想要一種方法來接受兩者作為參數數組。

所以不要這樣

await context.Entry(customer).Collection(e => e.Orders).LoadAsync();
await context.Entry(customer).Collection(e => e.Returns).LoadAsync();
await context.Entry(customer).Reference(e => e.Account).LoadAsync();

我想做這個:

await context.Entry(customer).Load(e=>e.Orders, e=>e.Returns, e=>e.Account);

我認為這是可能的,因為有類似context.Include(...)接受集合和引用。

在我的上下文課中,到目前為止我有這個:

public async Task Load<TEntity>(TEntity entity, params Expression<Func<TEntity, object>>[] propertyExpressions)
  where TEntity : class
{

  foreach (var propertyExpression in propertyExpressions) {

    var isCollection = typeof(IEnumerable).GetTypeInfo()
                       .IsAssignableFrom(propertyExpression.Body.Type);

    if(isCollection)
    {
      await Entry(entity)
        .Collection(propertyExpression)     // problem is here !!!!!
        .LoadAsync();
    }
    else
    {
      await Entry(entity)
        .Reference(propertyExpression)
        .LoadAsync();
    }
  }
}

問題行如上所示。輸入是object.Collection()需要IEnumerable<TProperty>

我該如何工作?

一般承認的答案

考慮到兩個方法都返回NavigationEntry派生類,並且都使用Microsoft.EntityFrameworkCore.Internal.ExpressionExtensions.GetPropertyAccess方法從傳遞的lambda表達式中獲取PropertyInfo.Name ,您可以使用相同的方法檢索名稱然後使用Navigation方式:

使用Microsoft.EntityFrameworkCore.Internal;

public async Task Load<TEntity>(TEntity entity, params Expression<Func<TEntity, object>>[] propertyExpressions)
    where TEntity : class
{
    foreach (var propertyExpression in propertyExpressions)
    {
        var propertyName = propertyExpression.GetPropertyAccess().Name;
        await Entry(entity).Navigation(propertyName).LoadAsync();
    }
}


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow