C# LINQ vs context.entity.Where()
这两个街区完全一样吗?一个比另一个有什么优势吗C# LINQ vs context.entity.Where(),c#,linq,entity-framework,C#,Linq,Entity Framework,这两个街区完全一样吗?一个比另一个有什么优势吗 using (var context = new TRANSITEntities()) { var result = context.Table1.Where(c => c.UserCode == "123"); } using (var context = new TRANSITEntities()) { va
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;
}
第一个选择context.Table1,第二个选择context.LINTE。所以他们从完全不同的收藏中挑选
此外,第一个选项在UserCode列上进行选择,第二个选项在CodeUsager列上进行选择。。
除此之外,第一个是第二个的翻译,你忘了翻译第二个,代码是一样的。C编译器只需将第二个查询转换为第一个查询,它们的行为将相同。第一个查询从context.Table1中选择,第二个查询从context.LINTE中选择。所以他们从完全不同的收藏中挑选
此外,第一个选项在UserCode列上进行选择,第二个选项在CodeUsager列上进行选择。。
除此之外,第一个是第二个的翻译,你忘了翻译第二个,代码是一样的。C编译器只需将第二个查询转换为第一个查询,它们的行为将完全相同。它们完全相同。编译器在解析任何方法之前将查询语法转换为lambda表达式版本。它们完全相同。编译器在解析任何方法之前将查询语法转换为lambda表达式版本。完全相同 您可以通过查看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);
还应该指出的是,结果实际上并不是一个结果。它是一个非执行/枚举IQueryable。这意味着它就像一个尚未运行的SQL语句。如果你要做
var t1 = result.ToArray()
var t2 = result.ToArray()
然后该查询将实际执行两次。t1和t2是内存数组中的实际结果…而不是结果。换句话说,结果实际上应该命名为query,而且,上面的示例永远不会起作用……因为如果在using块之外对结果调用ToArray,它将失败……因为一旦释放了上下文,就无法运行查询:
using (var context = new TRANSITEntities())
{
var result = context.Table1.Where(c => c.UserCode == "123");
}
// throws exception:
var array = result.ToArray();
完全一样
您可以通过查看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);
还应该指出的是,结果实际上并不是一个结果。它是一个非执行/枚举IQueryable。这意味着它就像一个尚未运行的SQL语句。如果你要做
var t1 = result.ToArray()
var t2 = result.ToArray()
然后该查询将实际执行两次。t1和t2是内存数组中的实际结果…而不是结果。换句话说,结果实际上应该命名为query,而且,上面的示例永远不会起作用……因为如果在using块之外对结果调用ToArray,它将失败……因为一旦释放了上下文,就无法运行查询:
using (var context = new TRANSITEntities())
{
var result = context.Table1.Where(c => c.UserCode == "123");
}
// throws exception:
var array = result.ToArray();
如果您试图从不同的表中进行选择,则情况不同 但是如果表是相同的,那么只是表示不同而已 没有区别,这只是您喜欢哪种编码方式的偏好
在创建sql表示之前,所有linq查询都将转换为Lambda。如果您试图从不同的表中进行选择,则它是不同的 但是如果表是相同的,那么只是表示不同而已 没有区别,这只是您喜欢哪种编码方式的偏好
在创建sql表示之前,所有linq查询都将转换为Lambda。摘自Julia Lermans的《编程实体框架: MSDN文档中说,“一般来说,我们建议使用查询语法 因为它通常更简单,可读性更强;但是,没有 方法语法和查询语法之间的语义差异。”* 因此,使用其中一个是一个风格和个人的问题 选择
Julia Lermans的书《编程实体框架》中: MSDN文档中说,“一般来说,我们建议使用查询语法 因为它通常更简单,可读性更强;但是,没有 方法语法和查询语法之间的语义差异。”* 因此,使用其中一个是一个风格和个人的问题 选择