2009-11-05 45 views
1

什么是两个所不同的是LINQ to SQL的where子句

1)

context.connection.open() 

var albums = (from a in context.Albums 
       where a.id == id 
      select a); 

context.connection.close() 

2)

context.connection.open() 

var albums = (from a in context.Albums 
      select a); 

context.connection.close() 

var result = albums.where((a)=>{a.id == id}); 

之间的不同会用第一个

更快它是

回答

2

除了打开/关闭他们应该评估的连接之外,第二个中的where子句看起来是不恰当的语法相同的代码。也就是说,当结果集实际枚举结束时,将生成并执行SQL。

你可以省略代码的休息和简单的写:

var albums = from a in context.Albums 
      where a.id == id 
      select a; 

var albums = context.Albums.Where(a => a.id == id); 

当结果列举他们将评估为同样的事情。

+0

谢谢你的所有答案..嗯..我有点困惑与数据逻辑层。这是否意味着我们已经在vs.net中生成的数据上下文已经代表了数据逻辑层... – LittleFunny 2009-11-05 09:12:37

1

由于所谓的退化查询有一个非常细微的差异。除了在连接时间,首先是有效地呼唤:

var albums = contact.Albums 
        .Where(a => a.id == id); 

而第二个将在它的额外Select电话:

var albums = contact.Albums 
        .Select(x => x) 
        .Where(a => a.id == id); 

话虽如此,我当然希望LINQ to SQL来在这两种情况下发出相同的SQL。

1

Quintin是对的。只会有一个(巨大)的区别,如果你会立刻评估查询:

var albums = (from a in context.Albums 
       where a.id == id 
       select a) 
      .ToList(); // force query evaluation 
         // 'SELECT * from Albums where id = ...' 

var albums = (from a in context.Albums 
       select a) 
       .ToList(); // force query evaluation 
         // 'SELECT * from Albums' 

var result = context.Albums.Where(a => a.id == id); // filters the list in memory 
1

要理解为什么没有任何区别,考虑的LINQ to SQL供应商是如何工作的。当您使用DataContext中的表时,您正在使用IQueryProvider。每次使用Where,Select,OrderBy等子句时,都没有执行任何操作 - 这些表达式中的每一个都只是提供给IQueryProvider,而IQueryProvider提供了很长的子句列表。

当您通过迭代结果来执行查询时,这些表达式会被收集起来并合并在一起,然后转换为T-SQL查询。所以添加表达式或添加它们的顺序并不重要,只要在您对结果进行foreach之前发生。