2010-11-09 159 views
10

我試圖建立一個使用實體框架的層次集合 - 請參閱下面的查詢 - 給定公司中的每個成員都有一個父成員 - 但是當試圖執行此操作時,我得到以下異常:分層實體框架查詢異常

System.NotSupportedException:類型 「會員」出現在兩個結構 不相容初始化一個 單個LINQ實體查詢內。一個 類型可以在 的兩個地方初始化相同的查詢,但只有在兩個地方設置了相同的 屬性,而 這些屬性設置爲相同的 的順序。

如果我刪除父母成員分配它的作品 - 對發生了什麼的任何想法?

 return from c in _Entities.Company 
       where c.Deleted == false 
       select new Member() 
       { 
        Name = c.Name, 
        ParentMember = new Member() 
        { 
         Name = c.ParentMember.Name 
        } 
       }; 

回答

12

我還沒有試過這個,但是錯誤信息給了你一個線索:你沒有在兩個地方以相同的順序設置相同的屬性。

如果您嘗試在外部Member()上設置ID屬性,會發生什麼?

+0

我剛剛更新的代碼中的問題,以反映實際的代碼 - 我有完全一樣的性質以相同的順序與設置ParentMember屬性的例外是設置如果這是有道理的,則是父母成員。 – 2010-11-09 16:02:43

+1

實際上,你仍然沒有設置所有相同的參數:外部有Name和ParentMember,而你只設置內部的名稱。嘗試分配屬性null。 – chris 2010-11-09 22:25:14

1

當您嘗試檢索每個成員記錄中的相同字段時,您將最終得到成員記錄的遞歸。你不能讓最後的父記錄等於空。

我會檢索我能做的,然後用更多的查詢建立記錄。請注意,您的公司實體將需要ParentId字段或類似字段。

var members = 
    return from c in _Entities.Company 
    select new Member() 
    { 
    Name = c.Name, 
    ParentId = c.ParentId 
    }; 

現在迭代並添加父記錄。

foreach (var member in members) 
{ 
    member.ParentMember = new Member 
    { 
     Name = _Entities.Company.First(c => c.Id == member.ParentId).Name 
    }; 
} 
2

嘗試

return (from c in _Entities.Company 
       where c.Deleted == false 
       select new 
       { 
        c.Name, 
        ParentMember = new 
        { 
         c.ParentMember.Name 
        } 
       }) 
.AsEnumerable() 
.Select(c=> new Member 
       { 
        Name = c.Name, 
        ParentMember = new Member 
        { 
         Name = c.ParentMember.Name 
        } 
       }); 
+2

+1這種捕捉22的情況恰恰相反,這是我獨立提出的解決方案。不如我希望的那麼優雅,並且有點浪費,因爲我們必須做兩倍的對象實例化,但仍然有效。 – 2013-06-25 13:31:08