重用LINQ查询

Bla*_*z0r 34 .net c# linq reusability

这不是关于结果的重用,而是关于语句本身的更多.使用var时也不会出现错误:LINQ to SQL:重用lambda表达式

出于纯粹的好奇心,我想知道是否可以重用一个LINQ语句.

假设我有以下LINQ语句:

.Where(x => x.Contains(""));
Run Code Online (Sandbox Code Playgroud)

是否有可能提取语句x => x.Contains("")并使用某种引用来供以后使用,比方说,另一个类?

所以我可以称之为: .Where(previouslySavedStatement);

Ham*_*jam 40

您可以将其存储在变量中.如果您正在IQueryable使用,请使用:

System.Linq.Expressions.Expression<Func<Foo, bool>> selector = x => x.Contains("");
Run Code Online (Sandbox Code Playgroud)

如果您正在使用,IEnumerable那么使用:

Func<Foo, bool> selector = x => x.Contains("");
Run Code Online (Sandbox Code Playgroud)

并在您的查询中使用它:

query.Where(selector);
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考@ Blaatz0r如果您正在使用`IEnumerable <T>`而不是`IQueryable <T>`,您只能使用`Func <Foo,bool> selector = ...`,但如果您使用的是`IQueryable <T>`你最挑衅地想要使用`Expression <Func <Foo,bool >>`版本. (6认同)

小智 8

是的,您可以编写一个包含要重用的查询的函数,该函数接受并返回IQueryable <T>

   public IQueryable<T> ContainsEmpty(IQueryable<T> query)
   {
       return query.Where(x => x.Contains(""));
   }
Run Code Online (Sandbox Code Playgroud)

现在您可以重复使用它:

   query1 = ContainsEmpty(query1);
   query2 = ContainsEmpty(another);
Run Code Online (Sandbox Code Playgroud)


Shl*_*omo 6

这取决于.有两种Where方法,Enumerable.WhereQueryable.Where.如果你正在应用.Wherea而IEnumerable不是第一个被调用,如果你将它应用于IQueryable第二个被调用.

因为Enumerable.Where接受Func,它不可重复使用.因为Queryable.Where接受表达式,它是可重用的.你可以这样做:

var x = new List<string>().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<Func<string, bool>>)quoteExpr.Operand;
Run Code Online (Sandbox Code Playgroud)

然后,您可以稍后重新应用where表达式:

var query2 = x.Where(funcExpr);
Run Code Online (Sandbox Code Playgroud)

  • 是的,我甚至读过接受的答案,我甚至也读过这个问题.我甚至相信我的回答可以回答这个问题,因为即使这样做,甚至比接受的回答更好. (2认同)