2012-09-08 87 views
2

我有以下查询:LINQ LAMBDA书面命令查询

 var query = db.Prog 
     .Where (a => a.Prog != "00000" && a.fn != "Koll") 
     .Select(a => new {a.Prog, a.MEfn}) 
     .OrderByDescending(a => a.MEfn) 

查询工作正常,但如果在你写一个lambda LINQ查询的顺序一般规则疑惑。意思,.Where来之前,选择等等。

有人能告诉我LINQ需要写入的顺序或最佳实践。

回答

1

对于您编写LINQ查询的顺序,没有一个最佳实践,它将取决于您是要先进行过滤还是您的投影。例如,对于您的情况,您将投射到一个匿名类型,该类型不包含您的过滤器使用的'fn'属性,所以如果您的选择是第一个,那么它将无法在where子句中使用。

一个更好的做法是给你的属性更神秘的名字。另外,'fn'不遵循PascalCase的属性名称,如果它是一个字段,那么它可能不应该公开。

0

他们应该在的顺序完全取决于你在做什么的背景。因此,如果您的OrderBy只是简单地将数据格式化为友好的视图,那么在裁剪完您的集合后将其放在最后,如果您正在寻找已排序集合的第一个值,那么在集合迭代到之前可能需要它获得第一名。

0

你可以是一个很好的订单。

让我们来区分db指向具有非常好的LINQ提供程序的SQL DB的情况,而db是内存中的对象。我想这是第一个。

如果您使用的是LINQ to SQL提供程序,则只有在将查询实现为对象时才会评估语句,因此SQL优化程序(在DB内部)将负责语句的排序。

当您的语句针对内存中的集合或来自LINQ to SQL的物化集合运行时,反之亦然。在这种情况下,它们会按顺序执行,所以您想要首先执行那些减少集合中结果数量的语句。 Where是最好的候选人!