2010-07-07 5 views
0

Je passe déjà assez de temps donc j'ai besoin d'aide de stackoverflow.Entity Framework: méthode de jointure

est ici une entité

Entity: Asset 
Field: AssetVersionID (int) PK 
Field: AssetID (int) FK 
Field: ReleaseTimestamp (DateTime) 

Ma tâche est de sélectionner des actifs avec AssetID unique et avec les dernières ReleaseTimestamp. fondamentalement, je besoin de fonctionner comme ça

public IQueryable<Asset> GetAssets(List<int> assetIds) 

dans SQL il ressemble à ceci:

select a1.* 
from Assets as a1 
join (
     select t.AssetID, max(t.ReleaseTimestamp) as ReleaseTimestamp 
     from Asssets as t 
     where AssetID in (1,2,3,4,5) 
     goup by AssetID 
    ) as a2 
on a1.AssetID = a2.AssetID and a1.ReleaseTimestamp= a2.ReleaseTimestamp 

comment le faire avec EF et LINQ?

J'ai essayé ceci:

public IQueryable<Asset> GetAssets(List<int> assetUIds) 
{ 
IQueryable<Asset> assets = _context.Assets.Where(a => assetUIds.Contains(a.UID)); 
var ff = assets.GroupBy(a => a.UID, a => a, 
       (uid, p2) => new {KEY = uid, rel = p2.Max(p2a => p2a.ReleaseTimestamp)}); 
IQueryable<Asset> assets2 = _context.Assets; 

var assets3 = from ass1 in assets2 
      join ass2 in ff on new {ass1.UID, ass1.ReleaseTimestamp} equals new {ass2.KEY, ass2.rel} 
      select ass1; 
return assets3; 
} 

mais j'ai erreur de syntaxe près de "rejoindre" essentiellement ceci fonctionne:

join ass2 in ff on ass1.UID equals ass2.KEY 

et cela ne

join ass2 in ff on new {ass1.UID, ass1.ReleaseTimestamp} equals new {ass2.KEY, ass2.rel} 

comme toujours:)

S'il vous plaît, aidez!

Répondre

1

Les expressions que vous rejoignez doivent être identiques. Changez-le pour:

join ass2 in ff on new {KEY = ass1.UID, rel = ass1.ReleaseTimestamp} equals new {ass2.KEY, ass2.rel}