【问题标题】:Entity Framework Query (?) [duplicate]实体框架查询(?)[重复]
【发布时间】:2018-11-16 19:33:17
【问题描述】:

我是 Entity Framework 的新手,我只想知道这两个代码行之间有什么区别:

using (dbStudentEntities db = new dbStudentEntities())
{
    var classList = (from cl in db.tblClasses
                     select cl.className).ToList();

    var classList2 = db.tblClasses.Select(clss => clss.className);
}

它返回相同的结果。但是他们叫什么?还有什么更好用?

【问题讨论】:

  • 除了下面的答案,还值得注意的是,第二次调用实际上不会查询数据库,而第一次会(因为ToList())。

标签: c# entity-framework


【解决方案1】:

下面的表达式

from item in items select item

是这个表达式的语法糖

items.Select(item => item)

语法格式在编译时被直译为扩展方法格式。

但是,在您的示例中,只有其中一个语句使用ToList 方法,因此该方法将根据items 分别是Enumerable 还是IQueryable<> 来枚举或执行查询。

至于哪个更好用,这主要是基于意见。对我来说,我发现 LINQ 语法可以在进行连接时提供清晰的信息。我对大多数其他查询使用扩展方法语法。两者都玩,看看在特定查询的上下文中哪一个对您有意义。通常,一种语法比另一种语法更清楚地说明查询的意图。其他时候没有任何区别。

当我们谈到这个话题时,值得注意的是 LINQ 语法通过与可用扩展方法进行模式匹配来工作。这意味着如果您没有导入可接受的 Select 扩展方法,from x in xs select x 将不起作用,因为语法会被该方法替换。更危险的一点是,您可以导入一组完全独立的扩展方法来匹配 LINQ 语法,只要这些方法签名与语法所期望的匹配。而且该功能也可以扩展到自定义类型,但我最近没有研究过。

【讨论】:

    【解决方案2】:

    Linq 表达式的使用和 Fluent 点符号方法的使用取决于开发人员的偏好。

    但是,这两个表达式都会返回一个 IQueryable<T> 对象作为准备,直到您调用附加的 Linq 扩展 ToList,它会强制执行 SQL 语句回到数据库。

    为了代码的可读性和作为其他 Linq 表达式的底层方法调用,我更喜欢使用点表示法。

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      第一个查询是Linq query。由于您向其中添加了.ToList(),它将导致输出列表

      第二个查询是Lambda expression,因为最后没有.ToList(),所以会得到IQueryable<T>IQueryable<T> 可用于进一步添加子句,而无需针对数据库触发查询。

      【讨论】:

      • 那么,用什么比较好?
      • 它们最终都给出了相同的输出。这取决于个人的学习和喜好。如果第一个看起来很容易,请使用它。我更喜欢第一个,因为它看起来与数据库查询非常相似。
      【解决方案4】:

      在您的第一个示例中,该示例使用语言的查询运算符使用表达式语法。编译器会将其转换为使用函数调用。这是个人喜好问题。

      classList 将是 List<T>,而 classList2 将是 IQueryable<T>

      【讨论】:

      • 那么,用什么比较好?
      • @LeojayRul 由你决定。
      • LINQ 语法在进行连接时可以提供更清晰的说明,这仅仅是因为等于运算符保持连接条件彼此相邻,而扩展方法必须对键选择器使用 lambda 表达式,对于相对简单的事情来说,这是很多语法开销/混淆。执行多个连接时问题会更加复杂,但即使在这种情况下,LINQ 语法仍然非常简单和紧凑。这确实是我认为选择一种语法而不是另一种会产生任何实际影响(除了社交)的唯一情况。
      猜你喜欢
      • 2011-12-06
      • 2011-12-18
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 2019-07-21
      • 2018-06-16
      • 2012-07-31
      相关资源
      最近更新 更多