【发布时间】:2021-08-03 21:05:44
【问题描述】:
我有一个在查询中返回 DateTime 列的表达式。
Expression<Func<T, DateTime>> GetDateExpression;
GetDateExpression = td => td.DateShipped;
但现在我想使用该表达式在 SQL 查询中形成过滤器。
query = query.Where(td => GetDateExpression(td) >= startDate);
但这不会编译。
错误 CS1955:不可调用的成员 'DateFilter.GetDateExpression' 不能像方法一样使用。
谁能告诉我如何使用 GetDateExpression 构造上面的 where 子句?
【问题讨论】:
-
@SvyatoslavDanyliv:您是说为此使用第三方库吗?我根本不相信这是必要的。事实上,我很确定它不是。虽然我不知道是否需要手动构建表达式树来完成这项工作。
-
你必须编写一个方法来构造一个
Lambda<Func<T, bool>表达式,主体为Expression.GreaterThanOrEqual(yourGetDateExpression, valueOfStartDateExpression),你还应该替换yourGetDateExpression的参数。看看这些答案:stackoverflow.com/questions/38507906/… 和 stackoverflow.com/questions/5430996/… 和 stackoverflow.com/questions/6736505/how-to-combine-two-lambdas。 -
@E.Shcherbo:用什么替换
yourGetDataExpression?如何合并它包含的表达式? -
不是表达式本身,而是它的参数。看东西,你的
GetDateExpression中的td和Where中的td是不同的东西,因此你需要将GetDateExpression的td替换为Where的td。据我所知,替换可以通过expression visitor来完成,您可以通过我发送的链接找到它
标签: c# linq expression expression-trees .net-5