2010-07-07 123 views
0

我花了足夠的時間,所以我需要從stackoverflow的幫助。實體框架:加入方法

這裏是一個實體

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

我的任務是用獨特的由assetid,並與最新的ReleaseTimestamp選擇資產。 基本上我需要在SQL函數這樣

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

它看起來像這樣:

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 

如何與EF和LINQ辦呢?

我嘗試這樣做:

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

,但我有語法錯誤附近的 「加盟」 基本上是這樣工作的:

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

,並以此作爲始終不

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

: )

請幫忙!

回答

1

您加入的表達式必須相同。將其更改爲:

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