2011-10-14 46 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);