2012-06-12 36 views
1

希望做一點重構的......使用NHibernate我有這個疑問目前哪一個更好的linq查詢? .Where(暴擊).FirstOrDefault()或.Where(someCrit).FirstOrDefault(someOtherCrit)?

public Widget FindByCode(string code) 
{ 
    return 
      _session 
       .Query<Widget>() 
       .Where(w => !w.IsDeleted) 
       .FirstOrDefault(w => w.Code == code); 
    } 

我想用這個

public Widget FindByCode(string code) 
{ 
    return 
      _session 
       .Query<Widget>() 
       .Where(w => !w.IsDeleted && w.Code == code) 
       .FirstOrDefault(); 
    } 

的或者是任何一個比其他更好嗎?任何提示,鏈接或代碼總是讚賞。 乾杯!

+0

他們都應該翻譯成相同的表達,因此相同的SQL,但第二個看起來更可讀。 – jrummell

回答

3

在linq2objects或LINQ2SQL你可以寫只是這樣的FirstOrDefault:

public Widget FindByCode(string code) 
{ 
    return 
      _session 
       .Query<Widget>() 
       .FirstOrDefault(w => !w.IsDeleted && w.Code == code); 
    } 

不知道有關NHibernate的,但但可能工作。你可以隨時用NHProf或普通的sql分析器檢查生成的sql。

2

將謂詞拆分成兩個塊似乎讓我感到困惑。我會將「過濾」代碼保存在一個地方,並將其全部放入.Where(您的第二個示例)或全部放入.FirstOrDefault。後一種選擇更簡潔,使用的操作員更少,因此通常是理想選擇。

0

第二個更好,因爲它只會根據兩個標準進行一次投影。第一個將根據第一個標準進行第一個投影,然後根據第二個標準應用第二個投影。 我會推薦使用第二種方法。

相關問題