Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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
C# 使用Where过滤器动态构建Include 背景_C#_Entity Framework_Linq - Fatal编程技术网

C# 使用Where过滤器动态构建Include 背景

C# 使用Where过滤器动态构建Include 背景,c#,entity-framework,linq,C#,Entity Framework,Linq,我需要能够建立一个.Include,将结果过滤到在特定日期或之前创建的记录。我不知道原始LINQ语句中对象的类型,我会找到它们(通过大量的研究,但这是可行的) 我有这样一个对象图: A -> Ac / \ Bc <- B \ / \ Cc <- C D -> Dc 问题是上面的代码崩溃是因为“A.B.Bc.CreatedUtc”不是加载日期属性的正确方法-我需要遍历。选择语句 问

我需要能够建立一个.Include,将结果过滤到在特定日期或之前创建的记录。我不知道原始LINQ语句中对象的类型,我会找到它们(通过大量的研究,但这是可行的)

我有这样一个对象图:

          A -> Ac
         /  \
  Bc <- B    \
       /      \  
Cc <- C        D -> Dc
问题是上面的代码崩溃是因为
“A.B.Bc.CreatedUtc”
不是加载日期属性的正确方法-我需要遍历
。选择
语句

问题 为了加载记录并对其进行过滤,我需要动态构建一个
。选择
以提取我需要的值(谢天谢地,这些值是基于继承的静态值),并将这些值放入匿名类型,然后可以使用
.Where()
对其进行过滤。所有这些都需要用最少的泛型来完成,因为我没有编译时类型来验证,我不得不滥用反射来让它们工作

基本上,我需要创建以下内容:

.Select( x => new
{
    Bc = x.B.Select(z => z.Bc.Select(y => y.CreatedUtc).Where( q => q > DateTime.UtcNow ) ),
    A= x
} )
动态地使用字符串“A.B.Bc”进行任何级别的嵌套

资源 在这里,我看到了如何过滤EF include方法:

这篇文章谈到动态创建一个Select,但它只是选择顶级值,似乎无法构建我的问题所需的其余部分:

动态Linq 使用System.Linq.Dynamic库,我尝试访问Bc的
CreatedUtc
值:

query = (IQueryable<T>) query.Select(includeString + ".CreatedUtc");

我相信
System.Linq.Dynamic
是您所需要的。这是一个最初由Microsoft ScottGu编写的库,它允许您从如下字符串构建LINQ查询:

IQueryable nestedQuery = query.Select("B.Bc.CreatedUtc");
其中查询是
IQueryable。关于查询语言的文档是。还有一个版本具有一些附加功能,它是dotnet.core版本

UPD1: 库缺少许多扩展方法,但有一个扩展方法。因此,使用后一个库,您可以执行以下操作:

query.SelectMany("B").SelectMany("Bc").Select("CreatedUtc");

当我包含字符串
“B.Bc.CreatedUtc”
时,我得到以下错误:
附加信息:类型“List
1”中不存在属性或字段“Bc”。看起来它没有正确地探索嵌套图?是的,我所有的外键关系都是用于此目的的集合-尽管它们将来可能是1-1,所以理想情况下,解决方案能够同时容纳这两个关系。@Max您包括它们了吗?(
.Include(…)
)@Max您必须告诉EF加载依赖项,否则它们将不可访问。如果您的意思是在传入的原始IQueryable上,则B是
Include
d,而Bc不是。
IQueryable nestedQuery = query.Select("B.Bc.CreatedUtc");
query.SelectMany("B").SelectMany("Bc").Select("CreatedUtc");