C# 在LINQ orderby中避免被零除

C# 在LINQ orderby中避免被零除,c#,linq,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中有什么方法可以实现这一点吗?这有效

我试着按平均分数排序,但不除以零:

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中有什么方法可以实现这一点吗?

这有效吗

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

尝试在进行除法之前只检查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);

我想你希望最终得到零分的文章:

orderby f.scoreSum == 0 ? 0 : f.scoreCount / f.scoreSum descending
不特定于linq:

f.scoreSum == 0 ? (f.scoreCount < 0 ? int.MinValue : int.MaxValue) : f.scoreCount / f.scoreSum
f.scoreSum==0?(f.scoreCount<0?int.MinValue:int.MaxValue):f.scoreCount/f.scoreSum
如果不是零,它将进行常规除法。如果为零,则取最接近右无穷大的整数(如果使用浮点运算,则会得到该整数),因此int.MinValue表示结果为负无穷大,int.MaxValue表示结果为正无穷大


警告:0/0也会导致“尽可能接近正无穷大”,如果这不正确,您可以添加另一个嵌套三元。。或者只是过滤掉0/0的大小写,因为0/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); 

可能添加
where f.scoreSum>0
:)您是否尝试使用where?“orderby(f.scoreSum==0?0:f.scoreCount/f.scoreSum)descending”如何?你的意思是
f.scoreSum/f.scoreCount
?分数不能是浮点数(它们除以零不会有问题),因此不应该编译。
f.scoreSum == 0 ? (f.scoreCount < 0 ? int.MinValue : int.MaxValue) : f.scoreCount / f.scoreSum
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);