[asp.net]任何区别写 linq 与 where 子句对顶部或底部

标签: Asp.net Linq .Net C#
发布时间: 2017/3/26 1:58:48
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我正在写一些 linq 查询,我很想知道是否有任何条款的顺序的差异。 例如︰

lstParam.Where(p => p).Select(p => p).ToList<Type>();

lstParam.Select(p => p).Where(p => p).ToList<Type>();

差异是指在性能或在开发标准。 谁能给一个短的解释吗?

解决方法 1:

如果你 .Where 是依赖于所做的更改在 .Select ,然后它会去后 it(1)。 如果你 .Select 将抛出异常不匹配的记录 .Where ,然后在哪里必须去 first(2)。 如果你 .Where 想要使用通过不传递的属性 .Select ,然后 .Where 必须去 first(3)。

你可以做多。选择和。凡以及...

var a=x.Select(p=>p).Where(p=>p).Select(p=>p);

一般来说,如果顺序并不重要到完成,然后 .Where 首先是速度更快,如果事情不得到优化。 这是因为一个新的对象不需要为任何失败实例化 .Where 。 这就是说,在绝大多数情况下的使用 IQueryable 在数据库上,它没有什么区别所有 (速度智者,如果顺序并不重要)。

示例 1:

var result=x.Select(p=>new Person { Name=p.First+" "+p.Last })
  .Where(p=>!String.IsNullOrEmpty(p.Name)); // works
var result=x.Where(p=>!String.IsNullOrEmpty(p.Name))
  .Select(p=>new Person { Name=p.First+" "+p.Last }); // Does not work

示例 2:

var result=x.Select(x=>new {DollarsPerDay=x.Dollars/x.Day})
  .Where(x=>x.Day>0); // may throw exception when day == 0
var result=x.Where(x=>x.Day>0);
  .Select(x=>new {DollarsPerDay=x.Dollars/x.Day}) // works

示例 3:

var result=x.Select(p=>new Person { Name=p.First+" "+p.Last })
  .Where(p=>p.Age>18); // Doesn't work
var result=x.Where(p=>p.Age>18)
  .Select(p=>new Person { Name=p.First+" "+p.Last }); // Works
赞助商