Алгоритм упорядочивания в стиле Hacker News в Linq-To-SQL - PullRequest
4 голосов
/ 13 февраля 2010

Согласно этому сайту алгоритм заказа для хакерских новостей выглядит примерно так:

(p - 1) / (t + 2) ^ 1,5

Описание:

голосов, поделенных на возрастной фактор

p = голосов (баллов) от пользователей. т = время с момента подачи в часах.

р вычтено 1 для отрицания податели голосования. возрастной фактор (время с момента подачи в часах плюс два) до мощность 1,5.

Учитывая структуру таблицы, подобную этой:

Пункт
ID
Ссылка
DatePosted

Item_Votes
ItemID
Значение

Каков наилучший способ реализации алгоритма с использованием 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;

Ответы [ 3 ]

4 голосов
/ 13 февраля 2010

Использование 2 1 Linq-запроса 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 голос
/ 13 февраля 2010

Это может работать (не проверено):

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();
1 голос
/ 13 февраля 2010

Используйте 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);
    }
}

http://msdn.microsoft.com/en-us/vcsharp/aa336756.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...