2014-02-20 65 views
0

我試圖做一個linq語句,與3部分的情況。我擁有它的方式看起來超級醜陋,我希望有人會透露一種更乾淨的方式來做到這一點。它的醜陋所以我要去把它分解成部分清潔的方式在linq做案例

爲了解釋這一點我連接這兩個表像這樣,執行左連接

from ccc in cDataContext.CategoryCountryCategoryTypeMappings       
join cl in currentLogs 
on ccc.CategoryCountryCategoryTypeMappingID equals 
cl.CategoryCountryCategoryTypeMappingID into final 

然後我通過storefrontID

篩選出結果
where f.CategoryCountryCategoryTypeMapping.Category.StorefrontID == StorefrontID 

我然後組然後訂購

group f by new {f.CategoryCountryCategoryTypeMapping.Category.CategoryID} into t1 
orderby t1.Key.CategoryID 

最後我試圖將結果輸出到一個結構,但看看狀態

select new 
CategoryStruct { 
    CategoryName =t1.Max(x=>x.CategoryCountryCategoryTypeMapping.Category.Name) , 
    Status = t1.Any(n=>n.Response==null)?99:t1.Any(n=>n.Response==0)?0:-1, 
      AverageResponseTime = (int)t1.Average(x => x.CaptureTime), 
    categoryId = t1.Key.CategoryID 
}); 

我使用terator操作符,它看起來很可怕。如果響應爲空(由於聯接)let狀態爲0,我試圖說,否則如果響應爲0,則讓狀態爲0,否則讓狀態爲-1。我不認爲把一個if語句會使它看起來更好。性能也是一個問題,將會有大約50k行,但執行分組後只有大約20個categoryStructs。

+0

如果您有工作代碼,只想尋求改進,請將問題發佈在[代碼審查](http://codereview.stackexchange.com/)而不是StackOverflow上。 –

+0

@ Pierre-LucPineault不要假設這是一個簡單的轉移按鈕? –

+0

我不這麼認爲。但是您可以輕鬆地複製粘貼文本,CR也是一個StackExchange網站,因此問題語法/符號相同。 –

回答

2

你可以通過你的select前增加兩個let變量,讓它乾淨了一點,在你的三元運營商使用這些變量。像這樣:

... 
let anyNullResponses = t1.Any(n=>n.Response==null) 
let anyZeroResponses = t1.Any(n=>n.Response==0) 
select new { 
... 
    Status = anyNullResponses ? 99 : 
      anyZeroResponses ? 0 : -1, 
... 
} 
1

我不認爲你可以做很多事情,除了稍稍使用間距來使其更容易閱讀。以下是你如何做到這一點的一個例子。

select new 
CategoryStruct { 
    CategoryName =t1.Max(x=>x.CategoryCountryCategoryTypeMapping.Category.Name) , 
    Status = t1.Any(n=>n.Response==null) ? 99 : 
      t1.Any(n=>n.Response==0) ? 0 : 
      -1, 
    AverageResponseTime = (int)t1.Average(x => x.CaptureTime), 
    categoryId = t1.Key.CategoryID 
});