【问题标题】:Which LINQ statement is better and why?哪个 LINQ 语句更好,为什么?
【发布时间】:2011-01-09 15:40:49
【问题描述】:

在这两个语句中,我都试图获取具有变量中指定名称的类别 ID;

两者都工作正常。有什么区别,哪个更好?

string name = "Progreammers";

var categoryID = from c in DataContext.Categories
                             where c.Name == name
                             select c.CategoryID;

var categoryID  = 
  DataContext.Categories.Single(c => c.Name == name).CategoryID;

编辑:表中的每个 CategoryID(字段)只有一个 名称(字段)。

【问题讨论】:

  • 您的示例代码中 categoryID 的类型会有所不同
  • 当然是,在 DB 中是 Bigint,在代码中很长。但我不明白你是什么意思?
  • 我的意思是,我认为第一个将是一个 IEnumerable,而第二个将是一个 long

标签: c# linq linq-to-sql


【解决方案1】:

这两个语句执行不同的功能。

第一个可以返回多条记录。

第二个只会返回一个 CategoryID。如果至少没有找到一条记录,它也会抛出异常。

以下查询等同于您的第一条语句:

var categoryID = DataContext.Categories.Where(c => c.Name == name).CategoryID;

以下是相当于第二条语句的查询语法:

var categoryID = (from c in DataContext.Categories
                 where c.Name == name
                 select c.CategoryID).Single();

无论哪种方式,一致性可能是最重要的(性能应该彼此相提并论,因为它们都以相同的方式执行)。如果您使用查询语法,请坚持使用。如果您开始使用lambda expressions,请尽可能多地使用它们。

【讨论】:

  • 另外,如果没有给定ID的记录,第二个会抛出。
  • 感谢第一个等效项。没有 => 表达式的第一个语句等效项是什么?谢谢
  • @asdi - 为第二条语句添加了查询语法。
【解决方案2】:

它们不一样。

如果有很多匹配项,第一个将返回一个列表。

第二个只会返回一个。

【讨论】:

    【解决方案3】:

    正如已经指出的那样,两者是不同的,但我认为您的问题的目的是询问“SQL”样式和“Lambda”样式的 LINQ 表达式之间是否存在差异。

    如果是这样,这里有一个类似的问题:

    LINQ: Dot Notation vs Query Expression

    【讨论】:

    • 查询语法实际上只是由编译器转换为 lambda 语法,所以只要两个语句都真正编写为执行相同的操作,它们是等效的。
    猜你喜欢
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    相关资源
    最近更新 更多