2010-01-26 81 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

相關問題