我正在尝试使可重用包含,并且当我具有特定的具体根实体时,它目前可以使用。但是,假设我具有这样的结构:
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>
,但是如果有人有任何建议,请随时提供帮助!
我认为有很多可能性。
我的第一个想法是封装属性表达式:
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;
}
}
如果要实现多个导航属性,则必须相应地修改两个代码示例。
已经有一些像您一样的问题和答案: