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

LINQ vs context.entity.Where()

完全一样。

您可以通过查看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是实际结果(一个内存阵列)。不是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文档说:"一般来说,我们推荐查询语法因为它通常更简单,更易读;然而,没有方法语法和查询语法的语义差异因此,使用哪一种是风格和个人的问题选择。