2014-03-25 298 views
0

我有一個DropDownList填充性別。優化linq避免if else

男性的選定值爲1,femail爲2

基於選定的值,我需要從數據庫中檢索數據。

if (ddlGender==1) 
{ 
    var data= (from item in dbContext.Sample where item.locId > 100 select item); 
} 
else 
{ 
    var data= (from item in dbContext.Sample where item.locId <100 select item); 
} 

如何通過避免條件和僅使用單個LINQ來優化此代碼?

+1

你不能避免某種條件在這裏。 – wudzik

+1

除非有必要,否則不要進行優化。此代碼不是瓶頸的來源,即使避免出現此情況,也不會獲得任何收益。 – Ehsan

+1

我不確定你爲什麼要「優化」掉if語句。與數據訪問相比,這幾乎是瞬間的。我認爲你在那裏得到了很好的結果。 – BenM

回答

2

試試這個帶有過濾器和三元運算符的使用

var data = from item in dbContect.Sample 
where (item.locId > 100 && ddlGender == 1) || 
(item.locId < 100 && ddlGender != 1) 
select item 
+1

+1用於刪除if-else,但這會影響性能,因爲每個項目執行的條件都會增加? –

+0

如果意圖在linq中有一個查詢是一個可能的解決方案。對於增加的表現,取決於表中存在多少項目。如果是幾行,可能會有小幅度的增加,可以忽略不計。 – user3401335

+0

我認爲這段代碼的性能會比原來的代碼差。原始代碼將導致在數據庫上執行兩個簡單查詢中的一個,具體取決於ddlGender的值。這些代碼不必要地將決定推向數據庫服務器,從而產生更復雜的查詢。 – BenM

3

另一種選擇是編寫查詢:

var data = dbContext.Sample; 
data = (ddlGender == 1) ? data.Where(i => i.locId > 100) 
         : data.Where(i => i.locId < 100); 

此選項消除了重複,不具有與生成的查詢附加條件的任何開銷(看到更新),我也覺得它很可讀。我也建議給一些明智的名字,以不斷100

更新:上面的查詢將產生簡單而明確的SQL

SELECT [Extent1].[locId] AS [locId], 
     [Extent1].[Foo] AS [Foo], 
     [Extent1].[Bar] AS [Bar] 
FROM [dbo].[Sample] AS [Extent1] 
WHERE [Extent1].[locId] > 100 

如果您將添加複雜的條件下,它會被轉換爲SQL。例如。

(item.locId > 100 && ddlGender == 1) || (item.locId < 100 && ddlGender != 1) 

將被轉換爲下面的查詢與兩個參數(假設你已經在數據庫中不可爲空場LOCID)

SELECT [Extent1].[locId] AS [locId], 
     [Extent1].[Foo] AS [Foo], 
     [Extent1].[Bar] AS [Bar] 
FROM [dbo].[Sample] AS [Extent1] 
WHERE (([Extent1].[locId] > 100) AND (1 = @p_linq_0) AND (@p_linq_0 IS NOT NULL)) 
    OR (([Extent1].[locId] < 100) AND 
     (NOT ((1 = @p_linq_1) AND (@p_linq_1 IS NOT NULL)))) 
+2

+1。這並沒有真正「優化」原始代碼(雖然這是最好的代碼),但它更短,更整潔。 – BenM

+0

@BenM謝謝!其實我正在談論優化代碼,這裏有另一個答案 - 當你在where語句中添加所有條件時,我將更新答案以指向那:) –