- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我需要能够构建一个 .Include,将结果过滤到在特定日期或之前创建的记录。我不知道原始 LINQ 语句中对象的类型,但我会找到它们(通过大量的循环,但这是可行的)。
我有一个这样的对象图:
A -> Ac
/ \
Bc <- B \
/ \
Cc <- C D -> Dc
对象 Ac
、Bc
、Cc
和 Dc
都是动态找到的(即开发人员在编写原始 linq 语句时不会键入这些关系)。然后需要将这些添加到 IQueryable 表达式中,并且只返回特定 DateTime 之前的值。
我尝试构建一个构造 lambda 并比较日期的函数。到目前为止,如果原始查询是 A.Include(x => x.B).Include(x => x.B.Select(y => y.C)
,我可以构造字符串 "A.B.Bc "
,所以我知道 A、B 和 Bc 的类型,以及它们之间的关联方式。
private static IQueryable<T> FilterChangeTrackerToDate<T>(this IQueryable<T> query, string includeString, DateTime targetDateTime)
{
var param = Expression.Parameter( typeof( T ), "x" );
var prop = Expression.Property(param, includeString + ".CreatedUtc");
var dateConst = Expression.Constant(targetDateTime);
var compare = Expression.LessThanOrEqual(prop, dateConst);
var lambda = Expression.Lambda<Func<T, bool>>(compare, param);
return query.Where(lambda);
}
问题是上面的代码崩溃了,因为 "A.B.Bc.CreatedUtc"
不是加载日期属性的正确方法 - 我需要遍历 .Select
语句。
为了同时加载记录和过滤它们,我需要动态构建一个.Select
来提取我需要的值(值得庆幸的是,它是基于继承的静态值)并将这些值放入匿名类型中,然后可以使用 .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 包含方法的地方: LINQ To Entities Include + Where Method
这篇文章讨论了动态创建一个 Select,但它只是选择顶级值,而且似乎无法构建我的问题所需的其余部分:How to create LINQ Expression Tree to select an anonymous type
使用 System.Linq.Dynamic 库,我尝试访问 Bc 的 CreatedUtc
值:
query = (IQueryable<T>) query.Select(includeString + ".CreatedUtc");
Where includeString = "B.Bc"
,但这给了我一个异常(exception):
Exception thrown: 'System.Linq.Dynamic.ParseException' in System.Linq.Dynamic.dll
Additional information: No property or field 'Bc' exists in type 'List`1'
最佳答案
我相信System.Linq.Dynamic
是你需要的。它是一个最初由 Microsoft 的 ScottGu 编写的库,它允许您从这样的字符串构建 LINQ 查询:
IQueryable nestedQuery = query.Select("B.Bc.CreatedUtc");
查询是IQueryable<A>
.
这个库有很多分支。你可以从here开始.关于查询语言的文档是 here .还有 here有一个版本具有一些附加功能和 here是 dotnet.core 版本。
UPD1: This库缺少 SelectMany 扩展方法,但 this一个有。因此,对于后一个库,您可以执行以下操作:
query.SelectMany("B").SelectMany("Bc").Select("CreatedUtc");
关于c# - 动态构建包含 Where 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38211631/
我有一个类似于以下的结构。 class A { string title; List bItem; } class B { int pric
本地流 和 远程流 两者都是“媒体流列表 ”。 本地流 包含“本地媒体流 ” 对象 但是,远程流 包含“媒体流 ” 对象 为什么差别这么大? 当我使用“本地流 “- 这个对我有用: localVide
我正在尝试将 8 列虚拟变量转换为 8 级排名的一列。 我试图用这个公式来做到这一点: =IF(OR(A1="1");"1";IF(OR(B1="1");"2";IF(OR(C1="1");"3";I
我正在使用面向对象编程在 Python 中创建一个有点复杂的棋盘游戏的实现。 我的问题是,许多这些对象应该能够与其他对象交互,即使它们不包含在其中。 例如Game是一个对象,其中包含PointTrac
有没有办法获取与 contains 语句匹配的最深元素? 基本上,如果我有嵌套的 div,我想要最后一个元素而不是父元素: Needle $("div:contains('Needle')")
出于某种原因,我无法在 Google 上找到答案!但是使用 SQL contains 函数我怎么能告诉它从字符串的开头开始,即我正在寻找等同于的全文 喜欢 'some_term%'。 我知道我可以使用
我正在尝试创建一个正则表达式来匹配具有 3 个或更多元音的字符串。 我试过这个: [aeiou]{3,} 但它仅在元音按顺序排列时才有效。有什么建议吗? 例如: 塞缪尔 -> 有效 琼 -> 无效 S
嘿所以我遇到了这样的情况,我从数据库中拉回一个客户,并通过包含的方式包含所有案例研究 return (from c in db.Clients.Include("CaseStudies")
如果关键字是子字符串,我无法弄清楚为什么这个函数不返回结果。 const string = 'cake'; const substring = 'cak'; console.log(string.in
我正在尝试将包含特定文本字符串的任何元素更改为红色。在我的示例中,我可以将子元素变为蓝色,但是我编写“替换我”行的方式有些不正确;红色不会发生变化。我注意到“contains”方法通常写为 :cont
我想问一下我是否可以要求/包含一个语法错误的文件,如果不能,则require/include返回一个值,这样我就知道所需/包含的文件存在语法错误并且不能被要求/包含? file.php语法错误 inc
我想为所有包含youtube链接的链接添加一个rel。 这就是我正在使用的东西-但它没有用。有任何想法吗? $('a [href:contains(“youtube.com”)]')。attr('re
我正在尝试在 Elasticsearch 中查询。除搜索中出现“/”外,此功能均正常运行。查询如下所示 GET styling_rules/product_line_filters/_search {
我正在开发名为eBookRepository的ASP.NET MVC应用程序,其中包含在线图书。 电子书具有自己的标题,作者等。因此,现在我正在尝试实现搜索机制。我必须使用Elasticsearch作
我已阅读Firebase Documentation并且不明白什么是 .contains()。 以下是文档中 Firebase 数据库的示例规则: { "rules": { "rooms"
我的问题是我可以给出条件[ 'BookTitleMaster.id' => $xtitid, ] 如下所示 $bbookinfs = $this->BookStockin->BookIssue->fi
我需要能够使用 | 检查模式在他们中。例如,对于像“dtest|test”这样的字符串,像 d*|*t 这样的表达式应该返回 true。 我不是正则表达式英雄,所以我只是尝试了一些事情,例如: Reg
我想创建一个正则表达式来不匹配某些单词... 我的字符:var test = "é123rr;and;ià456;or;456543" 我的正则表达式:test.match(\((?!and)(?!o
我在 XSLT 中有一个名为 variable_name 的变量,如果相关产品具有名称为 A 或 B 或两者均为 A & 的属性,我将尝试将其设置为 1 B.
您好,我想让接待员和经理能够查看工作类型和费率并随后进行更新。但是技术人员只能查看不能更新。该图是否有效? 我读到扩展用例是由发起基本用例的参与者发起的。我应该如何区分技术人员只能启动基本案例而不能启
我是一名优秀的程序员,十分优秀!