根据this site,黑客新闻的排序算法是这样的:
(p-1)/(t + 2)^ 1.5
说明
投票除以年龄因素
p =来自用户的投票(积分)。 t = 自提交数小时后的时间。
p减去1否定 提交者投票。年龄因素是(时间 自提交时间加上两个)到 1.5的力量。
给出类似于此的表结构:
物品
ID
链接
DatePostedItem_Votes
项目ID
价值
使用linq to sql实现算法的最佳方法是什么,我是否能够完全在linq中编写查询,或者我是否需要使用存储过程或其他东西。
更新。根据TJB的答案结束使用下面的代码:
var votesQuery =
from i in db.Items
join v in db.Item_Votes on i.ItemID equals v.ItemID
orderby
(double)(v.Value - 1) /
Math.Pow(
(DateTime.Now - i.DatePosted.Value).TotalHours + 2,
1.5) descending
select i;
答案 0 :(得分:4)
使用 2 1 Linq querie s (可能仍然更有效率)
var votesQuery =
from i in items
join v in votes on i.Id equals v.ItemId
orderby
(v.Value - 1) /
Math.Pow(
(DateTime.Now - i.Posted).Add(new TimeSpan(2,0,0)).Hours,
1.5 )
select new
{
Item = i,
Vote = v
};
答案 1 :(得分:1)
使用Comparer
。这将允许您以任何方式编写行之间比较的逻辑。
以下是一个示例,使用不区分大小写的顺序:
public void LinqExample()
{
string[] words = {
"aPPLE", "AbAcUs", "bRaNcH", "BlUeBeRrY", "ClOvEr", "cHeRry"
};
var sortedWords = words.OrderBy(a => a, new CaseInsensitiveComparer());
ObjectDumper.Write(sortedWords);
}
public class CaseInsensitiveComparer : IComparer<string>
{
public int Compare(string x, string y)
{
return string.Compare(x, y, StringComparison.OrdinalIgnoreCase);
}
}
答案 2 :(得分:1)
这可能有用(未经测试):
var orderedList =
from extracted in (
from i in unorderedList
select new
{
Item = i,
Order = (p - 1) / Math.Pow(t + 2, 1.5)
}
orderby extracted.Order
select extracted.Item
).ToList();