2010-01-26 49 views
2

在这两个语句中,我试图获取具有变量中指定名称的类别的ID;哪个LINQ语句更好,为什么?

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

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; 

编辑:只有一个名称(场),每类别ID(场)在表中。

+0

的categoryID的类型,将在您的示例代码不同 – Fredou 2010-01-26 19:03:56

+0

肯定是,在DB是BIGINT,在代码中它长。但我不明白你的意思? – 2010-01-26 19:11:43

+1

我的意思是,第一个会是,我认为,IEnumerable ,而第二个将是很长的 – Fredou 2010-01-26 19:14:50

回答

12

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

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

第二个将只返回一个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,尽可能多地使用它们。

+0

+1,比我快17秒:-) – Fredou 2010-01-26 18:59:24

+0

另外,如果没有给定ID的记录,第二个会抛出。 – 2010-01-26 19:00:26

+0

感谢第一个等价物。对于没有=>表达式的第一个语句,什么是等价的?谢谢 – 2010-01-26 19:05:11

3

他们是不一样的。

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

第二个将只返回一个。

0

如前所述,两者不同,但我认为您的问题的目的是询问“SQL”风格和“Lambda”风格的LINQ表达式是否有区别。

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

LINQ: Dot Notation vs Query Expression

+0

? – 2010-01-26 19:14:34

+0

查询语法实际上只是被编译器转换为lambda语法,所以只要这两个语句都被真正写入来做同样的事情,它们就是等价的。 – 2010-01-26 22:09:56

相关问题