2013-08-27 67 views
5

默認我有以下代碼。單用或病狀或Where子句

return 
    this.Storage.Customer.OfType<Preferred>() 
    .Include(b => b.Order) 
    .Where(cust => cust.Id == customerId && cust.CustomerType== (int)cusType) 
    .SingleOrDefault(); 

它可以如下消除其中被重寫。

return 
    this.Storage.Customer.OfType<Preferred>() 
    .Include(b => b.Order) 
    .SingleOrDefault(cust => cust.Id == customerId && cust.CustomerType == (int)cusType); 

哪一個更好的做法,爲什麼?

+7

生成的SQL查詢將是相同的,所以我會說這只是你的意見哪個更好。 – MarcinJuraszek

+1

其次更短,仍然易於閱讀。 –

+3

我認爲第一個是遵循分步代碼,並且更容易擴展/調試。 –

回答

1

首先你需要理解上的差異

this.Storage.Customer.OfType<Preferred>() 
.Include(b => b.Order) 
.Where(cust => cust.Id == customerId && cust.CustomerType== (int)cusType) 

這隻會創建一個查詢,但不會執行直到您調用ToList方法。

SingleOrDefault方法將實際執行查詢。因此,如果您想在查詢執行之前檢查或執行某些操作,則應使用where,然後調用SingleOrDefault。

所以總體來說,使用這裏是很好的做法按我個人的看法

2

多虧了調試的函數的返回值的複雜性,並在調試使用lambda表達式是不可能的,這是最好的方法:

var temp = this.Storage.Customer.OfType<Preferred>() 
    .Include(b => b.Order) 
    .Where(cust => cust.Id == customerId && cust.CustomerType == (int)cusType); 

return temp.SingleOrDefault(); 

這樣一來,如果有異常的在SingleOrDefault()(的東西,如果你正在做的複雜表情很常見),你可以把一個斷點在return,並在手錶面板做:temp.ToList();

+3

尊重這一點,這是一個意見。 – Maarten

+1

@Maarten我會稱之爲第一手體驗:-)我的代碼比OP建議的兩個版本更好,因爲我的代碼具有可驗證的優勢。生成的代碼與OP(在IL級別)等效/幾乎相同,它具有相同的可讀性,並且更易於調試。 – xanatos

0

舊後這主要是基於觀點的,但這裏的上面沒有提到的另一個考慮:

一個SingleOrDefault子句不能其次是Select等其他術語,因爲,正如Patel所述,它實際上是執行查詢。例如說,在路上,你要修改的查詢只返回客戶的名稱:

this.Storage.Customer.OfType<Preferred>() 
.Include(b => b.Order) 
.SingleOrDefault(cust => cust.Id == customerId && cust.CustomerType == (int)cusType) 
.Select(cust=>cust.Name); //compile error 

將無法​​正常工作,並且不能將SingleOrDefaultSelect從句移至因爲這時IdCustomerType字段對於SingleOrDefault中的lambda表達式不可見。相反,你需要先加回Where條款:

​​

因此由於Where條款往往是必要的,總是至少不錯的表現,它可能是很好的做法,始終使用它的一致性,可讀性,和可維護性。