gpt4 book ai didi

c# - 通过表达式树构建表达式列表

转载 作者:太空宇宙 更新时间:2023-11-03 19:55:44 24 4
gpt4 key购买 nike

我有以下基于列名和值构建表达式的方法:

public Func<TSource, bool> SimpleComparison<TSource>(string property, object value)
{
var type = typeof (TSource);
var pe = Expression.Parameter(type, "p");
var propertyReference = Expression.Property(pe, property);
var constantReference = Expression.Constant(value);
return Expression.Lambda<Func<TSource, bool>>
(Expression.Equal(propertyReference, constantReference),
new[] { pe }).Compile();
}

我正在尝试创建一个表达式列表,然后使用最终连接/编译的表达式查询我的数据源。

我尝试过使用 Expression.Block 但这个概念对我来说有点难以理解。我也看到了 Expression.Loop 但不确定我是否需要在这里使用它。

理想情况下,我可以做这样的事情:

var filters = request.Filter.Filters;

IQueryable<MyDTO> myDataSource = context.MyDataSource;

var expressions = null;

foreach (var filter in filters)
{

expressions.Add(SimpleExpression<MyDTO>(filter.Name, filter.Value));

}

return myDataSource.Where(expressions);

关于如何做这样的事情有什么想法吗?

最佳答案

你想多了。您根本不需要组合您的表达式。唯一复杂的部分是实现 SimpleComparison ,但你已经这样做了。好吧,主要是。你应该返回 Expression<Func<...>> , 不是 Func<...> ,所以应该是

public Expression<Func<TSource, bool>> SimpleComparison<TSource>(string property, object value)
{
// ...
return Expression.Lambda<Func<TSource, bool>>
(Expression.Equal(propertyReference, constantReference),
new[] { pe });
}

一旦有了它,您就可以通过调用 Where 来链接过滤器重复,像这样:

var filters = request.Filter.Filters;
IQueryable<MyDTO> query = context.MyDataSource;
foreach (var filter in filters)
query = query.Where(SimpleComparison<MyDTO>(filter.Name, filter.Value));
return query;

关于c# - 通过表达式树构建表达式列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33836819/

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