LINQ vs context.entity.Where()
本文关键字:Where entity vs context LINQ | 更新日期: 2023-09-27 18:06:15
这两个块完全相同吗?一个比另一个有什么优势吗?
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;
}
完全一样。
您可以通过查看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
是实际结果(一个内存阵列)。不是result
。换句话说,result
应该被命名为query
,而且,你上面的例子永远不会起作用…因为如果在using
块之外的结果上调用ToArray
,它将失败……因为一旦上下文被处置,就不能运行查询:
using (var context = new TRANSITEntities())
{
var result = context.Table1.Where(c => c.UserCode == "123");
}
// throws exception:
var array = result.ToArray();
它们完全一样。在解析任何方法之前,编译器将查询语法转换为lambda表达式版本。
第一个从
context.Table1
中选择,第二个从context.LINTE
中选择。所以他们从完全不同的集合中选择。
第一个选择UserCode列,第二个选择CodeUsager列。
除了(是第一个只是第二个的翻译,你忘了翻译第二个)代码是一样的。c#编译器只会将第二个查询转换为第一个查询,并且它们的行为相同。
如果你试图从不同的表中选择,那么它是不同的。
但是如果两个表是相同的,那么只是表示法不同而已。
没有区别,这只是你喜欢哪种编码方式的偏好。
在创建sql表示之前,所有linq查询都转换为Lambda。
摘自Julia Lermans的著作Programming Entity Framework:
MSDN文档说:"一般来说,我们推荐查询语法因为它通常更简单,更易读;然而,没有方法语法和查询语法的语义差异因此,使用哪一种是风格和个人的问题选择。