2009-08-20 18 views
2

我有以下的LINQ to SQL查詢表達式哪一個是更好的lambda表達式或

from msg in TblUserMessages 
join user in Aspnet_Users on msg.FromUserID equals user.UserId 
select new { 
     msg.FromUserID, 
     msg.ToUserID, 
     msg.MessageLocationID, 
     msg.MessageID, 
     user.UserName 
     } 

而繼LINQ方法表達:

TblUserMessages 
.Join (
    Aspnet_Users, 
    msg => msg.FromUserID, 
    user => user.UserId, 
    (msg, user) => 
    new 
    { 
     FromUserID = msg.FromUserID, 
     ToUserID = msg.ToUserID, 
     MessageLocationID = msg.MessageLocationID, 
     MessageID = msg.MessageID, 
     UserName = user.UserName 
    } 
) 

這兩個返回相同的結果集。例如, :

82522f05-2650-466a-a430-72e6c9fb68b7 
6b2a174a-8141-43d2-b3ad-5b199bcbfcae 
1 
1 
waheed 

哪一個更好用。 FIRST一個或SECOND之一。

謝謝

回答

12

它們是等價的。他們不只是返回相同的結果集 - 它們編譯成相同的代碼。

根據可讀性對個別情況使用查詢表達式或點表示法。對於連接,我發現點符號非常繁瑣 - 但我使用它的情況下,我只有一個或兩個子句(通常在/選擇)。即使有兩個條款(通常在選擇)我發現點符號很好,如果你然後需要使用它。比如,我喜歡:

var query = people.Where(person => person.Age > 18) 
        .Select(person => person.Name) 
        .Skip(100) 
        .Take(10); 

var query = (from person in people 
      where person.Age > 18 
      select person.Name) 
      .Skip(100) 
      .Take(10); 

對於較複雜的查詢(例如聯接)我可能只是將二者分開:

var baseQuery = from person in people 
       where person.Age > 18 
       join company on person.CompanyId equals company.CompanyId 
       select new { person.Name, company.Name }; 

var fullQuery = baseQuery.Skip(100) 
         .Take(10); 

我只是覺得這種分離使其更易於閱讀。

我相信對於開發人員來說,至少理解查詢表達式的基礎知識是非常有用的 - 事實上它們基本上是轉化爲點符號的,而且這種語言本身並不知道LINQ to Objects, LINQ to SQL等;這只是遵循適當模式的情況。這是一個偉大的設計,這意味着查詢表達式隻影響語言規範的一點點。

+1

很好的解釋:) – Waheed 2009-08-20 10:48:58

1

無論你發現哪一個更容易閱讀。

2

我總是去更可讀的選項,在這種情況下,我認爲它的LINQ片段。

3

有沒有更好一。使用你喜歡的。在這種情況下,我會使用'query'語法,因爲我認爲它比第二個更具可讀性。而且,既然我們正在編寫SQL,我認爲這個語法更像它。但我確信其他人會不同意並傾向於選擇lamda版本。

通常去與後面的語法btw,因爲我更喜歡拉姆達語法,因爲它往往更易讀,更短。請參閱this SO question

+1

lambda表達式不會更短。如果我有更多的連接,那麼它變得非常長。我想你會同意我的看法。 – Waheed 2009-08-20 10:41:51

+0

是的,我同意。這就是爲什麼我說'(...)經常*更可讀和更短':) – Razzie 2009-08-20 10:46:17

2

兩者表現都一樣好,但我更喜歡第一個,因爲它更易於閱讀和理解。

1

「編寫代碼,然後測量它以找出重構的內容。」你測量過嗎? 更好是主觀的。

你是否發現任何一個讓你想要選擇一個的問題?

0

這兩種語法之間有一點區別。由於編譯器必須將其轉換爲點語法,所以查詢表達式將採用較長的進行編譯。當然,它幾乎是完全無關緊要的,因爲:

  1. 編譯overhed是最小的,
  2. 發射的IL運行時需要處理的是針對這兩種情況下完全相同。
0

我必須動態構建查詢時使用Lambda表達式,並且在查詢完全知道時使用LINQ to SQL。

IQueryable<IncomeDetailsEntity> query; 
if (!string.IsNullOrEmpty(regioncode)) 
{ 
    if (!string.IsNullOrEmpty(compcode)) 
    { 
     query = db.IncomeDetailsEntities.Where(i => i.RegionCode == regioncode && i.CompanyCode == compcode); 
    } 
    else 
    { 
     query = db.IncomeDetailsEntities.Where(i => i.RegionCode == regioncode); 
    } 
} 
else 
{ 
    query = db.IncomeDetailsEntities; 
} 
return query.Select(i => new { i.RegionCode, i.Budget });