Algorithme de commande de style Hacker News dans Linq-To-SQL

Selon ce site, l’algorithme de commande pour les nouvelles des hackers ressemble à ceci:

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

La description:

Votes divisés par facteur d’âge

p = votes (points) des utilisateurs. t = temps depuis la soumission en heures.

p est soustrait de 1 pour annuler le vote des auteurs. Le facteur d’âge correspond à la puissance de 1,5 (temps écoulé depuis la soumission en heures plus deux).

Étant donné une structure de table similaire à celle-ci:

Article
ID
Lien
Date postée

Item_Votes
ID de l’article
Valeur

Quel serait le meilleur moyen d’implémenter l’algorithme en utilisant linq to sql, serais-je capable d’écrire la requête entièrement dans linq ou aurais-je besoin d’utiliser une procédure stockée ou autre chose?

Mettre à jour. Nous avons fini par utiliser le code ci-dessous basé sur la réponse de 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; 

Utilisation de 2 1 Linq querie s (il existe probablement encore un moyen plus efficace)

 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 }; 

Utilisez une Comparer . Cela vous permettra d’écrire la logique des comparaisons entre les lignes comme vous le souhaitez.

Voici un exemple utilisant un ordre ne respectant pas la casse:

 public void LinqExample() { ssortingng[] words = { "aPPLE", "AbAcUs", "bRaNcH", "BlUeBeRrY", "ClOvEr", "cHeRry" }; var sortedWords = words.OrderBy(a => a, new CaseInsensitiveComparer()); ObjectDumper.Write(sortedWords); } public class CaseInsensitiveComparer : IComparer { public int Compare(ssortingng x, ssortingng y) { return ssortingng.Compare(x, y, SsortingngComparison.OrdinalIgnoreCase); } } 

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

Cela pourrait fonctionner (non testé):

 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();