2008-12-16 8 views
2

été à la recherche d'un exemple rapide de tri d'un IQueryable (en utilisant Linq To SQL) en utilisant une valeur Aggregate.Tri de IQueryable par agrégat dans VB.net

J'ai fondamentalement besoin de calculer quelques valeurs dérivées (Pourcentage de différence entre deux valeurs, etc.) et de trier les résultats par ceci.

à savoir

retour rows.OrderBy (Fonction (s) CalcValue (s.Visitors, s.Clicks))

je veux appeler une fonction externe pour le calcul de l'agrégat. Cela devrait-il implémenter IComparer? ou IComparable?

grâce

[EDIT] ont essayé d'utiliser:

Public Class SortByCPC : Implements IComparer(Of Statistic) 

Public Function Compare(ByVal x As Statistic, ByVal y As Statistic) As Integer Implements System.Collections.Generic.IComparer(Of Statistic).Compare 
    Dim xCPC = x.Earnings/x.Clicks 
    Dim yCPC = y.Earnings/y.Clicks 
    Return yCPC - xCPC 
End Function 

End Class 

LINQ to SQL ne me aime pas utiliser IComparer

Répondre

0

Ma solution:

Dim stats = rows.OrderBy(Function(s) If(s.Visitors > 0, s.Clicks/s.Visitors, 0)) 

Cela attire également une division par zéro exceptions

0

Mon VB est assez mauvaise, mais je pense que cela est à quoi ça devrait ressembler. Cela suppose que CalcValues ​​renvoie un double et le type de rows est RowClass. Cet exemple n'utilise pas la version IComparer de l'extension OrderBy mais repose sur le fait que les doublons sont déjà comparables et renvoie CalcValue (supposé comme double) comme clé.

Dim keySelector As Func(Of Double, RowClass) = _ 
    Func(s As RowClass) CalcValue(s.Visitors, s.Clicks) 

return rows.OrderBy(keySelector) 

Voici quelques liens que vous pourriez trouver utiles.

IQueryable.OrderBy méthode d'extension

Lambda expressions pour Visual Basic

+0

Je ne peux pas obtenir ce travail pour LINQ to SQL IQueryable –

2

LINQ to SQL ne va que vous utiliser vos propres méthodes dans une requête - il ne peut pas voir en eux et travailler ce que vous voulez que la SQL à ressembler. Il ne peut voir qu'à l'intérieur des arbres d'expression, construits à partir d'expressions lambda dans la requête.

Ce que vous voulez est quelque chose comme:

Dim stats = From x in db.Statistics 
      Where (something, if you want filtering) 
      Order By x.Earnings/x.Clicks; 

Si vous voulez vraiment aller chercher tous les résultats et les commander, vous devez indiquer LINQ que vous êtes « fait » avec le côté IQueryable des choses - appelez AsEnumerable() et vous pouvez faire tout traitement restant sur le client. Il vaut mieux que le serveur fasse autant que possible.