繁体   English   中英

如何在实体框架中实现多个包含?

[英]How can I implement multiple Include in Entity Framework?

我使用实体框架 6。我有一个具有多个导航属性的 Transaction 对象。 使用多个 Include 很容易实现预先加载。

 var aa = db.Transactions.Include(p => p.Account).Include(p => p.Instrument);

如果要包含的字段是参数,我该如何实现?

var aa = db.Transactions.IncludeMore(delegatesToBeIncluded);   

如果delegatesToBeIncluded为 null,则不包含任何内容。

https://stackoverflow.com/a/38823723/5852947这与我想要的类似,但它使用字符串而不是委托。

https://stackoverflow.com/a/35889204/5852947这也很有趣。

如何在 Entity Framework Core 中以多个级别传递 lambda“include”? 这侧重于多个级别(我有一个级别)

https://stackoverflow.com/a/52156692/5852947这也很有希望。

我该往哪个方向走?

修订版 1 :为什么我需要这个? 将基于aa的元素创建新对象。 我意识到在每个对象创建时 EF 都会读取数据库(使用延迟加载)。 它只是 50 毫秒,但它重复了 n 次。 这个函数是在模板类中实现的,所以Transactions也是一个参数。

修订版 2 :在完整代码中有过滤(确切地说是分页),然后是 ToList()。 它在模板函数中实现的棘手部分。 dbTableSelector是一个委托: readonly Func<MainDbContext, DbSet<TDbTable>> dbTableSelector;

 var myList = dbTableSelector(db).Where(WhereCondition).
             Skip(numberOfSkippedRows).Take(PageSize).OrderBy(OrderByCondition).ToList();

之后,我将myList每个元素myList为另一种类型的对象。 这是为每个元素一个一个激活延迟加载的地方。 这就是我尝试使用 Include 的原因。 如果dbTableSelector(db)返回Transactions我必须在它返回时包含不同的元素让我们说Instruments 所以 IncludeMore 应该有一个 List 参数来定义要包含的字段。

这是解决方案。 正是基于

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM