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>
。
我如何使这项工作?
答案 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();
}
}