LINQ vs context.entity.Where()

时间:2011-08-18 16:17:43

标签: c# linq entity-framework

这两个块完全相同吗?一个人比另一个人有任何优势吗?

        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;
        }

5 个答案:

答案 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()

然后查询实际上会被执行两次。 t1t2是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文档说:“通常,我们建议使用查询语法   因为它通常更简单,更易读;但是,没有   方法语法和查询语法之间的语义差异。“*   因此,使用一个而不是另一个是风格和个人问题   选择。