这不是关于结果的重用,而是关于语句本身的更多.使用var时也不会出现错误:LINQ to SQL:重用lambda表达式
出于纯粹的好奇心,我想知道是否可以重用一个LINQ语句.
假设我有以下LINQ语句:
.Where(x => x.Contains(""));
是否有可能提取语句x => x.Contains("")
并使用某种引用来供以后使用,比方说,另一个类?
所以我可以称之为: .Where(previouslySavedStatement);
您可以将其存储在变量中.如果您正在IQueryable
使用,请使用:
System.Linq.Expressions.Expression> selector = x => x.Contains("");
如果您正在使用,IEnumerable
那么使用:
Funcselector = x => x.Contains("");
并在您的查询中使用它:
query.Where(selector);
是的,您可以编写一个包含要重用的查询的函数,该函数接受并返回IQueryable
public IQueryableContainsEmpty(IQueryable query) { return query.Where(x => x.Contains("")); }
现在您可以重复使用它:
query1 = ContainsEmpty(query1); query2 = ContainsEmpty(another);
这取决于.有两种Where
方法,Enumerable.Where
和Queryable.Where
.如果你正在应用.Where
a而IEnumerable
不是第一个被调用,如果你将它应用于IQueryable
第二个被调用.
因为Enumerable.Where
接受Func
,它不可重复使用.因为Queryable.Where
接受表达式,它是可重用的.你可以这样做:
var x = new List().AsQueryable(); var query = x.Where (n => n.Contains("some string")); //Extract the lambda clause var expr = query.Expression; var methodExpr = (MethodCallExpression)expr; var quoteExpr = (UnaryExpression)methodExpr.Arguments[1]; var funcExpr = (Expression >)quoteExpr.Operand;
然后,您可以稍后重新应用where表达式:
var query2 = x.Where(funcExpr);