2011-08-04 106 views
5

我寫了兩個使用連接方法的LINQ查詢。從本質上講,如果我切換要加入的對象的順序,查詢不再起作用並拋出錯誤:爲什麼這個LINQ連接查詢工作,但這另一個沒有?

「無法創建類型爲'Domain.Entities.UsersSitesRole'的常量值只有基本類型('如Int32,String和Guid')在此上下文中受支持。「

 var foo2 = //works 
      from p in privilegesForUser 
      join c in repository.Child on p.SiteId equals c.Child_SiteID 
      select new { ChildID = c.Child_ChildID, name = c.Child_FirstName, site = c.Child_SiteID, p.PrivilegeLevel }; 

     var foo3 = //throws exception 
      from c in repository.Child 
      join p in privilegesForUser on c.Child_SiteID equals p.SiteId 
      select new { ChildID = c.Child_ChildID, name = c.Child_FirstName, site = c.Child_SiteID, p.PrivilegeLevel }; 

目的privilegesForUser是從我的實體框架上下文(UsersSiteRole)衍生的實體的列表,並且repository.Child是從我的EF上下文中IQueryable<Child>爲好。

+1

請同時顯示拋出的異常。 – Jethro

+2

@Jethro:再次閱讀問題。 – BoltClock

回答

4

這是由EF解析它在擴展方法中獲得的表達式樹的方式引起的。

很多情況下,查詢在邏輯上是正確的,並且在IEnumerable(Linq to Objects)上執行得很好,但在Linq to Entities中失敗。基本上,僅僅將任何邏輯表達式樹編譯成適當的SQL語句幾乎是不可能的(SQL是不理想的,遠不是面向對象的世界),EF放棄了這種情況。隨着時間的推移,你習慣瞭解什麼是有效的,什麼不可行。

+0

我剛剛遇到這[鏈接](http://msdn.microsoft.com/en-us/library/bb513866.aspx)這似乎表明我甚至不應該嘗試我在做什麼(加入一個內存收集與來自數據庫)。我想知道如果我.ToList()兩組數據,並加入他們,如果連接順序仍然有任何影響.... – Elbelcho

+0

如果我想加入30個對象與另一個30,我只是加載它們和處理客戶端方便。千千萬萬的做法是不可接受的。這關乎數據量。 此外,使用** SQL事件探查器**來確定您的查詢如何工作。嘗試一下你的工作版本,看看發生了什麼。 –

+0

感謝您的建議,好主意。另外我測試了,在我的情況下,如果我使用.ToList()創建的內存對象中的兩個操作,連接順序變得無關緊要。 – Elbelcho