Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework core 重用实体框架核心中的include语句_Entity Framework Core_Navigation Properties - Fatal编程技术网

Entity framework core 重用实体框架核心中的include语句

Entity framework core 重用实体框架核心中的include语句,entity-framework-core,navigation-properties,Entity Framework Core,Navigation Properties,我正在尝试创建可重用的包含,当我有特定的具体根实体时,它目前可以工作。但假设我有这样的结构: public class A { public B NavigationB { get; set; } } public class B { public C NavigationC { get; set; } } public class C { } 我的手机包括扩展 public static class IncludeExtensions { public stat

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

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
    }
}
公共静态类IncludeExtensions
{
公共静态IQueryable MyIncludesB(此IQueryable查询)
{
返回query.Include(q=>q.NavigationC);
}
公共静态IQueryable MyIncludesA(此IQueryable查询)
{
返回query.Include(q=>q.NavigationB)
.MyIncludesB();//如何实现此功能
}
}
如果我只有一个根,基本上一切都正常,例如
A
,但是如果我想使用根
B
进行提取,该怎么办?这样做的目的是包含
B
所需的所有内容,但当使用
A
作为根目录时,则包含
A
的所有内容,当包含
B
时,重用
MyIncludesB


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

我认为有很多可能性

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

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());
    }
}
如您所见,您可以将
string
传递给方法
Include
。您可以传递完整的导航属性链

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

已经有一些问题和答案与您的类似:

简单:


难:

我认为有很多可能性

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

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());
    }
}
如您所见,您可以将
string
传递给方法
Include
。您可以传递完整的导航属性链

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

已经有一些问题和答案与您的类似:

简单:


硬:

必须将'iqueryable'转换为'iqueryable'才能使用扩展方法。a实现了b吗?不,它们没有共同点,只有一个导航属性。你可以实现一个接口,其中包含它们的共同属性。这个方法采用“IQueryable”,我不确定你是否正确理解了这个问题,但它们没有任何共同点。我只想在另一个包含链中重用独立的包含,这样我就不必总是从
MyIncludesB
inside
MyIncludesA
复制粘贴所有包含,您必须将“iqeryable”转换为“iqeryable”才能使用扩展方法。a实现了b吗?不,它们没有共同点,只有一个导航属性。你可以实现一个接口,其中包含它们的共同属性。这个方法采用“IQueryable”,我不确定你是否正确理解了这个问题,但它们没有任何共同点。我只想在另一个包含链中重用独立的包含,这样我就不必总是从
MyIncludesB
inside
MyIncludesA