我自己的OrderBy函数

dom*_*ren 4 .net c# sql linq entity-framework

我正在写一段代码,它将根据评级来排序照片列表.每张照片都存储在DB中,每张照片都有正面和负面投票数等信息.我想通过公式对它们进行排序,其中我计算正面投票的百分比,第一张照片是具有最高百分比的照片.

为此我使用了标准的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

以及使用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();
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 6

删除第一次调用ToList并使用lambda表达式而不是定义比较器:

var result = db.Pictures
    .Include(q => q.Tags)
    .Include(q => q.User)
    .OrderByDescending(q => 
         q.PositiveVotes + q.NegativeVotes == 0
             ? -1
             : q.PositiveVotes / (double)(q.PositiveVotes + q.NegativeVotes))
    .Skip(n * 10)
    .Take(10)
    .ToList();
Run Code Online (Sandbox Code Playgroud)