【问题标题】:Reuse include statements in Entity Framework Core在 Entity Framework Core 中重用包含语句
【发布时间】:2020-08-14 16:31:36
【问题描述】:

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

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
    }
}

如果我有单根,基本上一切都好。 A,但是如果我想使用 root B 进行提取呢?想法是包含B 所需的所有内容,但是当使用A 作为root 时,则包含A 的所有内容,当包含B 时,重用MyIncludesB

我不确定这是否可行,因为 include 正在返回 IIncludableQueryable&lt;A, B&gt;,但如果有人有任何建议,请随时提供帮助!

【问题讨论】:

  • 不,它们没有任何共同点,只是一个导航属性。
  • 您可以实现一个接口,其中包含它们共同的属性。并且该方法采用 'IQueryable'
  • 我不确定您是否正确理解了这个问题,但它们没有任何共同点。我只想在另一个包含链中重用独立包含,因此我不必总是从 MyIncludesB 复制粘贴所有包含在 MyIncludesA

标签: entity-framework-core navigation-properties


【解决方案1】:

我认为有很多可能性。

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

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

如您所见,您可以将Expression&lt;Func&lt;B, C&gt;&gt; 传递给方法Include

我的第二个想法是实现包含字符串.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;
    }
}

如您所见,您可以将string 传递给方法Include。您可以传递完整的导航属性链。

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

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

简单:Entity Framework - Include Multiple Levels of Properties

困难:Multiple Includes() in EF Core

【讨论】:

    猜你喜欢
    • 2020-05-11
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多