什么是不同的linq to sql where子句

时间:2009-11-05 06:08:32

标签: c# performance linq-to-sql

两者之间有什么不同

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});

使用第一个

会更快吗?

4 个答案:

答案 0 :(得分: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);

在枚举结果时,他们会评估相同的事物。

答案 1 :(得分: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。

答案 2 :(得分: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

答案 3 :(得分:1)

要理解为什么没有区别,请考虑LINQ to SQL提供程序的工作原理。当您使用DataContext中的表时,您正在使用IQueryProvider。每次使用Where,Select,OrderBy等子句时,您都没有执行任何操作 - 每个表达式都只是给IQueryProvider,IQueryProvider会生成很长的子句列表。

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