2011-08-05 109 views
3

我有回到過去的UserBattle記錄每一個用戶查詢:轉換IQueryable的<IEnumerable的<Entity>>到的IQueryable <Entity>

objectContext.UserBattles. 
GroupBy(bu => bu.UserId, bu => bu). 
Select(gbu => gbu.OrderByDescending(bu => bu.DateTime).First()); 

遺憾的是它不工作(至少MySQL的.NET連接器供應商不能將First轉換爲SQL)。作爲替代方案,我可以用Take(1)替代第一個電話。但不幸的是,在這種情況下,結果將是IQueryable<IEnumerable<UserBattle>>而不是IQueryable<UserBattle>。有沒有辦法得到IQueryable<UserBattle>而不去LINQ To Objects(例如,SelectMany會解決我的問題)。

+0

嘗試.SingleOrDefault(),你想要什麼的方法 –

+0

如果你只選擇一條記錄,那麼轉到LINQ to Objects有什麼問題? –

+0

@Bertrand Marron,每個用戶一個 – SiberianGuy

回答

1

FirstFirstOrDefaultSingleSingleOrDefault工作的所有的LINQ的整理方法Entities查詢的內容(如在「貪婪」運營商的方法結束這導致查詢執行)。

但是在投影(選擇(...))中僅支持FirstOrDefault

這就是SQL Server的.NET Provider的情況。如果你的查詢甚至不適用於FirstOrDefault,那麼它很可能是MySQL .NET Connector的限制(按設計或錯誤?)。

僅僅提及完整性:在LINQ to Entities中完全不支持LastLastOrDefault,既不作爲整理方法也不支持投影。這就是爲什麼您的Select表達式必須寫爲gbu => gbu.OrderByDescending(bu => bu.DateTime).FirstOrDefault()。邏輯相同的表達式gbu => gbu.OrderBy(bu => bu.DateTime).LastOrDefault()可能在LINQ to Objects中,但在LINQ to Entities中不可用。

0

嘗試.SingleOrDefault(),爲你想

+0

不幸的是neighbour SingleOrDefault或FirstOrDefault轉換爲SQL(引發異常)。我想這是MySQL .NET Connector提供者的問題 – SiberianGuy

相關問題