当前位置:  开发笔记 > 编程语言 > 正文

重用LINQ查询

如何解决《重用LINQ查询》经验,为你挑选了3个好方法。

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

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

假设我有以下LINQ语句:

.Where(x => x.Contains(""));

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

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



1> Hamid Pourja..:

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

System.Linq.Expressions.Expression> selector = x => x.Contains("");

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

Func selector = x => x.Contains("");

并在您的查询中使用它:

query.Where(selector);


仅供参考@ Blaatz0r如果您正在使用`IEnumerable `而不是`IQueryable `,您只能使用`Func selector = ...`,但如果您使用的是`IQueryable `你最挑衅地想要使用`Expression >`版本.

2> 小智..:

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

   public IQueryable ContainsEmpty(IQueryable query)
   {
       return query.Where(x => x.Contains(""));
   }

现在您可以重复使用它:

   query1 = ContainsEmpty(query1);
   query2 = ContainsEmpty(another);



3> Shlomo..:

这取决于.有两种Where方法,Enumerable.WhereQueryable.Where.如果你正在应用.Wherea而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);


是的,我甚至读过接受的答案,我甚至也读过这个问题.我甚至相信我的回答可以回答这个问题,因为即使这样做,甚至比接受的回答更好.
推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有