如何在Entity Framework中实现多个Inclusion?

问题描述 投票:0回答:2

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

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

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

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

如果

delegatesToBeIncluded
为空,则不包含任何内容。

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 都会读取 DB(使用延迟加载)。虽然只有50ms,但是却重复了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
的每个元素转换为另一种类型的对象。这是为每个元素一一激活延迟加载的地方。这就是为什么我尝试使用 Include。如果
dbTableSelector(db)
返回
Transactions
我必须在返回时包含不同的元素,让我们说
Instruments
。所以 IncludeMore 应该有一个 List 参数,它定义要包含的字段。

c# entity-framework eager-loading
2个回答
0
投票

这是解决方案。它是基于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);

0
投票

基于:https://learn.microsoft.com/en-us/answers/questions/1315166/parameterizing-theninclude()-in-entity-framework

public static class IQueryableExtensions
{
    public static IQueryable<T> IncludeMultiple<T>(this IQueryable<T> query,
        params Expression<Func<T, object?>>[] includes) where T : class
    {
        foreach (var include in includes)
        {
            query = query.Include(include);
        }
        return query;
    }
}

用途:

var query = db.Entity.IncludeMultiple(n => n.NavProp1, n => n.NavProp2);
© www.soinside.com 2019 - 2024. All rights reserved.