如何在 Entity Framework 中实现多个包含?
How can I implement multiple Include in Entity Framework?
我使用 Entity framework 6. 我有一个具有多个导航属性的事务对象。使用多个Include很容易实现预加载。
var aa = db.Transactions.Include(p => p.Account).Include(p => p.Instrument);
如果要包含的字段是参数,我该如何实现?
var aa = db.Transactions.IncludeMore(delegatesToBeIncluded);
如果 delegatesToBeIncluded
为 null 则不包含任何内容。
这与我想要的类似,但它使用字符串而不是委托。
这个也有意思
这个侧重于多层次(我有一层)
这也很有前途。
我该往哪个方向走?
修订版 1:为什么我需要这个?
将基于 aa
的元素创建新对象。我意识到在每个对象创建时 EF 都会读取数据库(使用延迟加载)。它只是 50 毫秒,但它重复了 n 次。
这个函数是在模板中实现的class,所以Transactions也是一个参数。
修订版 2:在完整代码中有过滤(确切地说是分页),然后是 ToList()。它在模板函数中实现的棘手部分。 dbTableSelector
是代表:readonly Func<MainDbContext, DbSet<TDbTable>> dbTableSelector;
var myList = dbTableSelector(db).Where(WhereCondition).
Skip(numberOfSkippedRows).Take(PageSize).OrderBy(OrderByCondition).ToList();
之后,我将 myList
的每个元素转换为另一种类型的对象。这就是为每个元素一个一个地激活延迟加载的地方。这就是我尝试使用 Include 的原因。如果 dbTableSelector(db)
returns Transactions
我必须在它 returns 时包含不同的元素 让我们说 Instruments
。因此 IncludeMore 应该有一个 List 参数来定义要包含的字段。
这是解决方案。它基于 this.
public static class IQueryableExtensions
{
public static IQueryable<T> IncludeMultiple<T, TProperty>(this IQueryable<T> query,
Expression<Func<T, TProperty>>[] includeDelegates) where T : class
{
foreach (var includeDelegate in includeDelegates)
query = query.Include(includeDelegate);
return query;
}
}
这是电话:
var pathsA = new Expression<Func<ViewTransaction, object>>[2] { p => p.Account, p => p.Instrument };
var pathsB = new Expression<Func<ViewTransaction, object>>[1] { p => p.Account};
var pathsC = Array.Empty<Expression<Func<ViewTransaction, object>>>();
var a = db.ViewTransactions.IncludeMultiple(pathsA).Single(e => e.Id == 100);
我使用 Entity framework 6. 我有一个具有多个导航属性的事务对象。使用多个Include很容易实现预加载。
var aa = db.Transactions.Include(p => p.Account).Include(p => p.Instrument);
如果要包含的字段是参数,我该如何实现?
var aa = db.Transactions.IncludeMore(delegatesToBeIncluded);
如果 delegatesToBeIncluded
为 null 则不包含任何内容。
这与我想要的类似,但它使用字符串而不是委托。
我该往哪个方向走?
修订版 1:为什么我需要这个?
将基于 aa
的元素创建新对象。我意识到在每个对象创建时 EF 都会读取数据库(使用延迟加载)。它只是 50 毫秒,但它重复了 n 次。
这个函数是在模板中实现的class,所以Transactions也是一个参数。
修订版 2:在完整代码中有过滤(确切地说是分页),然后是 ToList()。它在模板函数中实现的棘手部分。 dbTableSelector
是代表:readonly Func<MainDbContext, DbSet<TDbTable>> dbTableSelector;
var myList = dbTableSelector(db).Where(WhereCondition).
Skip(numberOfSkippedRows).Take(PageSize).OrderBy(OrderByCondition).ToList();
之后,我将 myList
的每个元素转换为另一种类型的对象。这就是为每个元素一个一个地激活延迟加载的地方。这就是我尝试使用 Include 的原因。如果 dbTableSelector(db)
returns Transactions
我必须在它 returns 时包含不同的元素 让我们说 Instruments
。因此 IncludeMore 应该有一个 List 参数来定义要包含的字段。
这是解决方案。它基于 this.
public static class IQueryableExtensions
{
public static IQueryable<T> IncludeMultiple<T, TProperty>(this IQueryable<T> query,
Expression<Func<T, TProperty>>[] includeDelegates) where T : class
{
foreach (var includeDelegate in includeDelegates)
query = query.Include(includeDelegate);
return query;
}
}
这是电话:
var pathsA = new Expression<Func<ViewTransaction, object>>[2] { p => p.Account, p => p.Instrument };
var pathsB = new Expression<Func<ViewTransaction, object>>[1] { p => p.Account};
var pathsC = Array.Empty<Expression<Func<ViewTransaction, object>>>();
var a = db.ViewTransactions.IncludeMultiple(pathsA).Single(e => e.Id == 100);