这两个块是否完全相同?一个相对于另一个有什么优势吗?
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
是REAL结果(在内存数组中)...不是result
。换句话说,result
应该真正被命名为query
并且,上面的示例将永远无法工作...因为如果在ToArray
块之外的结果上调用using
,它将失败。 ..因为一旦上下文被处理,您将无法运行查询: using (var context = new TRANSITEntities())
{
var result = context.Table1.Where(c => c.UserCode == "123");
}
// throws exception:
var array = result.ToArray();
关于c# - LINQ vs context.entity.Where(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7110704/