gpt4 book ai didi

.net - 创建动态包含子查询的 Linq 表达式

转载 作者:行者123 更新时间:2023-12-04 17:55:09 25 4
gpt4 key购买 nike

我最近偶然发现了在运行时动态创建 Linq 表达式的问题。我发现的大多数示例都处理相当简单的任务,即仅将给定数据库实体的一个属性与单个参数进行比较。像这样:

 Session.Query.Where(m => m.Name.Contains("test"))

这也可以通过更通用的方法来实现:
var item = Expression.Parameter(typeof (MyClass), "item");
var property = Expression.Property(item, "Name");
var containsMethod = typeof(string).GetMethod("Contains", new[] { typeof(string) });
var searchExpression = Expression.Constant(searchString, typeof(string));
var containsMethodExpression = Expression.Call(property, containsMethod, searchExpression);
var lambda = Expression.Lambda<Func<MyClass, bool>>(containsMethodExpression, item);
query = query.Where(lambda);

但是,有时任务会更复杂一些,人们希望获得以下内容:
Session.Query.Where(m => m.SpecialProperty.Any(f => f.Name.Contains("test")));

其中“SpecialProperty”的类型为 List<>,属性“Name”的类型为字符串。

是否可以动态构建这样的 Linq 表达式,如何实现?这种方法是否有任何性能问题?

最佳答案

找到了一个适用于我的特定用例的解决方案,并且完全符合我的要求。

/* 
building expression tree
example: Session.Query.Where(m => m.SpecialProperty.Any(f => f.Name.Contains("test")))
*/

var innerItem = Expression.Parameter(typeof(MyInnerClass), "f");
var innerProperty = Expression.Property(innerItem, "Name");
var innerMethod = typeof(string).GetMethod("Contains", new[] { typeof(string) });
var innerSearchExpression = Expression.Constant(searchString, typeof(string));
var innerMethodExpression = Expression.Call(innerProperty, innerMethod, new[] { innerSearchExpression });
var innerLambda = Expression.Lambda<Func<MyInnerClass, bool>>(innerMethodExpression, innerItem);

var outerItem = Expression.Parameter(typeof(MyOuterClass), "m");
var outerProperty = Expression.Property(outerItem, info.Name);
/* calling a method extension defined in Enumerable */
var outerMethodExpression = Expression.Call(typeof(Enumerable), "Any", new[] { typeof(MyInnerClass) }, outerProperty, innerLambda);
var outerLambda = Expression.Lambda<Func<MyOuterClass, bool>>(outerMethodExpression, outerItem);
query = query.Where(outerLambda);

需要这种相当乏味的方法而不是更优雅的单行 LINQ-Expression,以允许对类型和方法名称进行参数化。
但是,我当然不介意其他有关可能的性能损失的建议和想法。

此代码片段很可能也有助于解决 How to produce a Subquery using non-generic Lambda .

关于.net - 创建动态包含子查询的 Linq 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9545183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com