【发布时间】:2011-11-12 19:15:48
【问题描述】:
我正在编写一段代码,它将根据照片的评分对照片列表进行排序。每张照片都存储在数据库中,每张照片都有正面和负面投票数等信息。我想按照我计算正面投票百分比的公式对它们进行排序,第一张照片是百分比最高的。
为此,我使用了标准的 IComparer 接口,并编写了自己的 Comparer 函数,用于比较两张照片。问题是我必须先从数据库下载所有照片的列表。这似乎是我想避免的很多不必要的努力。所以我想知道是否可以创建我自己的 SQL 函数来在数据库端进行比较,然后只返回我想要的照片?比在服务器端比较所有照片效率更高?
我自己的比较器的代码:
public class PictureComparer : IComparer<Picture>
{
public int Compare(Picture p1, Picture p2)
{
double firstPictureScore = (((double)p1.PositiveVotes/(double)(p1.PositiveVotes+p1.NegativeVotes))*100);
double secondPictureScore = (((double)p2.PositiveVotes / (double)(p2.PositiveVotes + p2.NegativeVotes)) * 100);
if (firstPictureScore < secondPictureScore) return 1;
if (firstPictureScore > secondPictureScore) return -1;
return 0;
}
}
以及使用comaprer的代码:
var pictures = db.Pictures.Include(q => q.Tags).Include(q => q.User).ToList();
pictures = pictures.OrderBy(q => q, new PictureComparer()).Skip(0 * 10).Take(10).ToList();
【问题讨论】:
-
在考虑问题的答案之前,在您的方法 PictureComparer.Compare() 中,当您计算 firstPictureScore 和 secondPictureScore 时,您可能会忘记 * 100。它不会改变比较中的任何内容
-
有什么理由不能编写一个只返回所需记录并从 EF 调用它的存储过程?
-
“我想要的照片”是什么意思?前 X 个?
-
@PierrOz,是的,你是对的,我可以省略“*100”,前 X 张照片的意思是我使用“.Skip(0 * 10).Take(10 )" 功能仅从列表中的选定位置拍摄 10 张照片,这就是为什么我不想从数据库中下载所有照片并对其进行排序。
-
@Oded,也许我可以,但这不是我曾经做过的事情,这就是为什么我要求这种情况下的最佳解决方案,最有效和最容易生产的解决方案。跨度>
标签: c# .net sql linq entity-framework