2017-03-17 60 views
-1

我有分層的一對多關係鏈。Linq加入表並使用包含

我想從取決於選擇在第一個表

這裏表的最後許多連鎖檢索對象是我的LINQ: VAR名單=新名單(); 對象A是根表

IEnumerable<ObjectA> selectedObjectsAs = GetGrantedObjectAs(id).ToList(); 

IEnumerable<ObjectC> selectedObjectsCs 
         = from c in DbContext.ObjectCs 
         join b in DbContext.ObjectBs on c.BId equals b.Id 
         join a in DbContext.ObjectAs on b.AId equals a.Id 
         where selectedObjectsAs.Contains(a) 
         select c; 

list.AddRange(selectedObjectsCs.ToList()); 

當最後一行運行到我的AddRange得到以下異常

無法創建類型的恆定值「對象A」。只有原始類型或枚舉類型在此上下文中受支持。

任何想法可以解決問題?

+0

「不工作」是無益的。它編譯失敗嗎?它會給你一個不期望的結果嗎?我向你保證,查詢完全符合它的要求,所以目前還不清楚你的問題是什麼。你的具體問題是什麼? –

+0

在調試過程中得到實際的異常。我會在一分鐘後發佈它 – akd

+0

因此,您的過程在此首先詢問SO,然後再調查問題?我認爲你有這個倒退。 –

回答

0
join b in DbContext.ObjectBs on c.BId equals c.Id 

您正在嘗試與兩個引用加入bc

c.Id更改爲b.Id我會認爲會工作。

+0

這只是一個錯字錯誤。 – akd

+0

啊好的。你能編輯包含它給出的錯誤/結果的問題嗎? – Nathangrad

0

我想這就是你要找的內容(使用導航屬性):

//Contains method in Linq to entities only works with primitive types or enumeration types 
var IdsOfA=GetGrantedObjectAs(id).Select(a=>a.Id); 
var selectedObjectsCs=DbContext.ObjectAs.Where(a=>IdsOfA.Contains(a.Id)) 
             .SelectMany(a=>a.Bs.SelectMany(b=>b.Cs)) 
+0

還沒有嘗試過這一個,但不知道哪一個會更好,或者這是否導致與我的解決方案相同的查詢。我需要使用sql profiler來查明。這個想法是,objectC是角色列表。 ObjectA是根級別。對象A>對象B> ObjectC。如果用戶在ObjectA中有角色,那麼我需要通過遵循ObjectB的ObjectB然後通過ObjectC來獲取用戶角色來查找特定角色映射到的實際角色。類似的,如果一個用戶在ObjectB中被賦予角色,那麼我需要找到在ObjectC中映射角色的實際角色 – akd