C# 使用Where过滤器动态构建Include 背景
我需要能够建立一个.Include,将结果过滤到在特定日期或之前创建的记录。我不知道原始LINQ语句中对象的类型,我会找到它们(通过大量的研究,但这是可行的) 我有这样一个对象图: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”不是加载日期属性的正确方法-我需要遍历。选择语句 问
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");