这两个块完全相同吗?一个人比另一个人有任何优势吗?
using (var context = new TRANSITEntities())
{
var result = context.Table1.Where(c => c.UserCode == "123");
}
using (var context = new TRANSITEntities())
{
var result = from c in context.Table1
where c.UserCode == "123"
select c;
}
答案 0 :(得分:4)
完全一样。
您可以通过查看ToString()
来自行验证 string query1String, query2String;
using (var context = new TRANSITEntities())
{
var result = context.Table1.Where(c => c.UserCode == "123");
query1String = result.Expression.ToString();
}
using (var context = new TRANSITEntities())
{
var result = from c in context.Table1
where c.UserCode == "123"
select c;
var query2String = result.Expression.ToString();
}
Assert.AreEqual(query1String, query2String);
还应该注意result
实际上不是结果。它是一个未执行/枚举的IQueryable
。这意味着它就像一个尚未运行的SQL语句(某种程度)。如果你要做
var t1 = result.ToArray()
var t2 = result.ToArray()
然后查询实际上会被执行两次。 t1
和t2
是REAL结果(在内存数组中)......不是result
。换句话说,result
应该真正命名为query
而且,上面的例子永远不会有用......因为如果你在{{1}之外的结果上调用ToArray
阻止,它将失败...因为一旦处理了上下文就无法运行查询:
using
答案 1 :(得分:3)
第一个从 context.Table1
中选择,第二个从context.LINTE
中选择。所以他们从完全不同的系列中选择。
第一个选择UserCode列,第二个选择CodeUsager列。
除此之外(是第一个只是第二个的翻译而你忘了翻译第二个)代码是相同的。 C#编译器只会将第二个查询转换为第一个查询,它们的行为相同。
答案 2 :(得分:2)
他们完全一样。在解析任何方法之前,编译器将查询语法转换为lambda表达式版本。
答案 3 :(得分:1)
如果您尝试从不同的表中进行选择,则它会有所不同。
但是如果表格相同则表示不同。
没有区别只是偏好您喜欢哪种方式进行编码。
在创建sql表示之前,所有linq查询都将转换为Lambda。
答案 4 :(得分:1)
来自Julia Lermans的书“编程实体框架:
”MSDN文档说:“通常,我们建议使用查询语法 因为它通常更简单,更易读;但是,没有 方法语法和查询语法之间的语义差异。“* 因此,使用一个而不是另一个是风格和个人问题 选择。