在Entity Framework Core中重复使用include语句

问题描述 投票:1回答:1

我正在尝试使可重用包含,并且当我具有特定的具体根实体时,它目前可以使用。但是,假设我具有这样的结构:

public class A
{
    public B NavigationB { get; set; }
}

public class B
{
    public C NavigationC { get; set; }
}

public class C
{

}

以及我的包含扩展名

public static class IncludeExtensions
{
    public static IQueryable<B> MyIncludesB(this IQueryable<B> query)
    {
        return query.Include(q => q.NavigationC);
    }

    public static IQueryable<A> MyIncludesA(this IQueryable<A> query)
    {
        return query.Include(q => q.NavigationB)
            .MyIncludesB(); // how can I implement this
    }
}

[基本上,如果我只有一个root,一切都会好起来的。 A,但是如果我想使用根B进行提取怎么办?这样的想法是包含B所需的所有内容,但是当以A作为根目录时,则包含A的所有内容,并且当包含B时,请重用MyIncludesB

我不确定这是否可能,因为include返回IIncludableQueryable<A, B>,但是如果有人有任何建议,请随时提供帮助!

entity-framework-core navigation-properties
1个回答
0
投票

我认为有很多可能性。

我的第一个想法是封装属性表达式:

public static class IncludeExtensions
{
    public static Expression<Func<B, C>> MyIncludeListB()
    {
        return q => q.NavigationC;
    }

    public static Expression<Func<A, B>> MyIncludeListA()
    {
        return q => q.NavigationB;
    }

    public static IQueryable<B> MyIncludesB(this IQueryable<B> query)
    {
        return query.Include(MyIncludeListB());
    }

    public static IQueryable<A> MyIncludesA(this IQueryable<A> query)
    {
        return query.Include(MyIncludeListA()).ThenInclude(MyIncludeListB());
    }
}

我的第二个想法是用字符串.Include(string)实现包含:

public static class IncludeExtensions2
{
    public static IEnumerable<string> MyIncludeListB()
    {
        return "NavigationC".Split(";");
    }

    public static IEnumerable<string> MyIncludeListA()
    {
        return "NavigationB;NavigationB.NavigationC".Split(";");
    }

    public static IQueryable<B> MyIncludesB(this IQueryable<B> query)
    {
        foreach (var i in MyIncludeListB())
        {
            query = query.Include(i);
        }

        return query;
    }

    public static IQueryable<A> MyIncludesA(this IQueryable<A> query)
    {
        foreach (var i in MyIncludeListA())
        {
            query = query.Include(i);
        }

        return query;
    }
}

如果要实现多个导航属性,则必须相应地修改两个代码示例。

已经有一些像您一样的问题和答案:

简易:Entity Framework - Include Multiple Levels of Properties

硬:Multiple Includes() in EF Core

© www.soinside.com 2019 - 2024. All rights reserved.