【发布时间】:2011-02-01 11:14:34
【问题描述】:
我需要减少一个表达式
Expression<Func<TQueryResult, TParam, bool>>
到
Expression<Func<TQueryResult, bool>>
通过将TParam value 作为常量注入表达式。
具体例子:
protected IQueryable<TQueryResult> AddQueryFilter<TQueryResult, TParam>(IQueryable<TQueryResult> query, Expression<Func<TQueryResult, TParam, bool>> exp, TParam param)
{
object obj = param;
if (obj is string)
{
if (!string.IsNullOrWhiteSpace((string) obj))
{
var reducedExp = new Expression<Func<TQueryResult, bool>>()
// ...
// the magic that I need to inject param value
//..
return query.Where(reducedExp);
}
}
else if (obj is DateTime)
{
//... return query.Where(reducedExp);
}
else
throw new InvalidOperationException("Param type not supported");
return query;
}
//usage
var qr = Manager.Invoices.Query;
qr = AddQueryFilter(qr, (invoice, value) => value == invoice.Number, numberEdit.Text);
qr = AddQueryFilter(qr, (invoice, value) => value == invoice.Date, dateEdit.Date);
qr = AddQueryFilter(qr, (invoice, value) => invoice.Description.Contains(value), descEdit.Text);
【问题讨论】:
-
是 AddQueryFilter === ConstructSearchExpression 吗?
-
是的,对不起。我现在已经更正了。
-
您使用的是哪种 LINQ 实现? LINQ 到 SQL?到英孚?什么?
-
致英孚。但我不明白这有多重要,我只是想减少一个通用表达式,不管后端如何。
-
@Boris 这很重要,因为 EF 不支持
Expression.Invoke(LINQ-to-SQL 支持)。这意味着您需要完全重写表达式树。