两者之间有什么不同
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});
使用第一个
会更快吗?答案 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查询。因此,添加表达式或添加它们的顺序并不重要,只要它在您对结果进行预测之前发生。