2010-11-17 4 views
0

Comme le montre à: How to limit an SQL query to return at most one of something?Comment puis-je écrire une version SQL de cette requête LINQ?

je les tableaux suivants:

Plates-formes

  • PlatformID
  • Nom

Produits

  • ProductID
  • Nom

Communiqués

  • ID
  • ProductID
  • PlatformID
  • Version
  • ReleaseDate

La table releases stocke chaque version d'un produit logiciel pour une plate-forme particulière. Je souhaite écrire une requête pour renvoyer la dernière version de chaque produit pour chaque plate-forme dans la table Releases. C'EST À DIRE. Si je libère le produit X version 2.0 sur les plates-formes A, B et C, il y aura 3 enregistrements dans la table de presse:

  • un pour le produit X version 2.0 sur la plateforme A publiée le 2010-11-17
  • un pour le produit X version 2.0 sur la plateforme B publiée le 2010-11-17
  • un pour le produit X version 2.0 sur la plateforme C publiée le 2010-11-17

Ainsi, étant donné un numéro de produit, comment J'obtiens cette information? J'ai essayé d'utiliser GROUP BY comme la solution LINQ que j'ai utilisée mais apparemment je ne peux pas traduire LINQ en SQL aussi bien que .NET.

Répondre

2

Pédant:

Select 
    PR.Name, 
    PL.Name, 
    REL.Version, 
    REL.ReleaseDate 
From 
    Releases As REL 
    Inner Join Products As PR 
    On REL.ProductID = PR.ProductID 
    Inner Join Platforms As PL 
    On REL.PlatformID = PL.PlatformID 
Where 
    REL.ID = (Select Top 1 Latest.ID 
      From Releases As Latest 
      Where Latest.PlatformID = REL.PlatformID 
       And Latest.ProductID = REL.ProductID 
      Order By Latest.ReleaseDate Desc) 

devrait également travailler (en supposant que vous ne diminuez versions):

Select 
    PR.Name, 
    PL.Name, 
    Max(REL.Version), 
    Max(REL.ReleaseDate) 
From 
    Releases As REL 
    Inner Join Products As PR 
    On REL.ProductID = PR.ProductID 
    Inner Join Platforms As PL 
    On REL.PlatformID = PL.PlatformID 
Group By 
    PR.Name, 
    PL.Name 
+0

Merci beaucoup, la première solution était parfaite. Le second n'aurait pas été approprié puisque j'utilise la syntaxe 'Major.Minor.Maintenance.Build' pour les versions, donc je ne pense pas que' MAX() 'aurait traité cela correctement. –

2

Est-ce que vous connaissez la classe DataContext de LINQ a une Log property?

Puisque vous avez déjà une requête LINQ, pourquoi ne pas regarder derrière le rideau? :-)

+0

Nice, merci pour le conseil. –

Questions connexes