避免在LINQ orderby中除以零

时间:2011-10-14 09:30:58

标签: c# linq

我试图按平均分数排序而不是除以零:

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中实现这个目标?

7 个答案:

答案 0 :(得分:4)

我想你最终想要零分文章:

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

答案 1 :(得分:3)

这有用吗?

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

答案 2 :(得分: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不是'无论如何,无论如何都可以排序。

答案 3 :(得分: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);

答案 4 :(得分: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);

答案 5 :(得分:0)

f.scoreSum != 0 ? f.scoreSum : 1

答案 6 :(得分:0)

假设您不需要scoreSum为0的记录(无效记录?),而不是在Orderby子句中进行所有计算,请尝试在where子句中添加过滤器,因为这样可以减少表扫描和提高绩效。

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);