2009-05-08 11 views
1

J'ai une table et j'ai besoin de sélectionner l'enregistrement basé sur un Id. Je veux seulement retourner l'enregistrement qui a le Max (Date) sur un champ de date. Comment je fais ça?Linq To Sql assistance vb.net

Dans SQL Server J'utilise cette

SELECT * FROM dch 
WHERE EffectiveDate = (SELECT MAX(EffectiveDate) FROM dch 
WHERE ID = 99) AND ID = 99 

Comment puis-je faire dans LINQ. Malheureusement, cette application est codée dans VB.NET comme nous l'avons hérité de cette façon.

Je tentais ces

Dim qry = (From dch In db.dch _ 
        Where dch.Dealer.Equals(Dealer) _ 
        Select dch.EffectiveDate).Max() 

ou

Dim qry = (From dch In db.dch _ 
        Where dch.Dealer.Equals(Dealer) _ 
        Select).Max(dch.EffectiveDate) 

Et, évidemment, ils ne fonctionnent pas. Suis-je même proche? Toute idée serait appréciée.

Merci d'avance.

Répondre

2

S'il vous plaît excuser les erreurs dans ma syntaxe VB, je suis un programmeur (surtout) C#.

Dim item = db.dch.Where(Func(d) d.ID == 99) _ 
       .OrderByDescending(Func(d) d.EffectiveDate)_ 
       .Take(1) 

Il serait effectivement être mis en œuvre comme

select top 1 <...columns...> 
from dch 
where ID == 99 
order by EffectiveDate desc 

que je pense est équivalent à votre requête.

+0

Cela semble être la façon de me le faire. Bien que cela "semble" inefficace, rappelez-vous que la requête n'est pas exécutée jusqu'à ce que vous essayiez réellement d'itérer les résultats, à quel moment il aura été optimisé. –

+0

doux !!! Fonctionne parfaitement pour mes besoins. J'apprécie le pourboire !! ~ ck –

0

Je ne réponds pas spécifiquement à votre question. C'est plus l'un de ceux qui enseignent à un homme à pêcher des scénarios de type ... mais lors de l'apprentissage de Linq, ajoutez ce site à vos favoris et visitez-le souvent. 101 Linq VB Samples

Your specific answer is here under Max about halfway down.

Ce site résoudre 80% des nouvelles questions de LINQ à l'avenir. Pour l'anecdote, par votre description je pense que c'est ce que vous voulez.

dim results = (from d in db.dch where d.ID == 99 select d.EffectiveDate).Max()

D'accord, qui renverra seulement la plus haute Entrée en vigueur.

0

Dans votre deuxième requête, vous devez passer une expression lambda comme argument à la méthode d'extension Max:

Dim qry = (From dch In db.dch _ 
      Where dch.Dealer.Equals(Dealer) _ 
     ).Max(Function (item) item.EffectiveDate) 

Edit: Prendre un second regard sur votre question, je me rends compte que je ne sais vraiment pas de réponse parce que vous auriez besoin de faire une deuxième requête pour obtenir les résultats réels. En outre, la première requête que vous avez essayée doit faire exactement la même chose que ma requête (qui obtient la valeur EffectiveDate maximale).