用于显式加载引用和集合的EF Core helper方法

时间:2017-04-23 12:45:01

标签: c# entity-framework reflection lambda entity-framework-core

EF Core支持explicit loading。上下文有两个重载,一个用于引用,一个用于集合。

有两种方法没用,而且变得混乱。我想要一种方法来接受两者作为参数数组。

所以不是这个

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>

我如何使这项工作?

1 个答案:

答案 0 :(得分:4)

考虑到两个方法都返回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();
    }
}