2011-10-14 45 views
4

我試圖通過平均成績命令不被零除:避免除排序依據

var articles = (from f in DB.faqs 
       orderby f.scoreCount/f.scoreSum descending 
       select new Article(f.ID, f.question, f.scoreSum, f.scoreCount)) 
       .Take(wantedItems); 

有沒有辦法在LINQ實現這一目標?

+2

也許加上'那裏f.scoreSum> 0' :) – Reniuz

+0

你嘗試用在哪裏? http://msdn.microsoft.com/en-us/library/bb311043.aspx – wiero

+0

「orderby(f.scoreSum == 0?0:f.scoreCount/f.scoreSum)descending」? – ivan

回答

3

我想您是零得分物品進行到底:

orderby f.scoreSum == 0 ? 0 : f.scoreCount/f.scoreSum descending 
3

這是行不通的?

orderby (f.scoreSum != 0) ? f.scoreCount/f.scoreSum : 0.0 descending 
+1

分數不能爲浮點數(它們不會被零除),所以不應該編譯。 – harold

0

試着在分割之前檢查0。

var articles = (from f in DB.faqs 
      orderby f.scoreSum == 0 ? 0 : f.scoreCount/f.scoreSum descending 
      select new Article(f.ID, f.question, f.scoreSum, f.scoreCount)) 
      .Take(wantedItems); 
0
var articles = (from f in DB.faqs 
      orderby f.scoreSum!=0? (f.scoreCount/f.scoreSum) : 0 descending 
      select new Article(f.ID, f.question, f.scoreSum, f.scoreCount)) 
      .Take(wantedItems); 
0
f.scoreSum != 0 ? f.scoreSum : 1 
1

並非專用LINQ:

f.scoreSum == 0 ? (f.scoreCount < 0 ? int.MinValue : int.MaxValue) : f.scoreCount/f.scoreSum 

如果不爲零,它會進行正常的分工。如果爲零,它將採用最接近整數的正確無窮大(如果您使用的是浮點數,您將獲得最接近的整數),所以int.MinValue表示結果爲負無窮,int.MaxValue表示結果爲正值無窮。

注意:0/0也會導致「儘可能接近正無窮大」,如果這還不行,您可以添加另一個嵌套三元組......或者僅過濾出0/0個案例,因爲0/0 isn反正任何地方都無法分類。

0

假設您不需要scoreSum爲0(無效記錄?)的記錄,而不是執行Orderby子句中的所有計算,請嘗試在where子句中添加一個篩選器,因爲應該減少tablescans並提高性能。

var articles = (from f in DB.faqs 
       where f.scoreSum != 0 
       orderby f.scoreCount/f.scoreSum descending 
       select new Article(f.ID, f.question, f.scoreSum, f.scoreCount)) 
       .Take(wantedItems);