0

數據庫使用代碼優先遷移進行基因處理。EF5代碼第一次遷移在嵌套層次結構內導航

我有這樣的父子關係,每個人都有孩子,兒童可以有自己的孩子等

public class Person 
{ 
    public string Name { get; set; } 
    public bool Flagged { get; set; } 
    public virtual ICollection<Person> Children { get; set; } 
    public virtual Person Master { get; set; } 
    ... 
} 

什麼是找到這些東西的最有效的方法是什麼?到目前爲止,我一直在使用遞歸查詢,它似乎很慢,並不是一件好事。我讀了Common Table Expressions,但我不確定這是否適合我的需求並支持EF 代碼優先遷移

  1. 人員發現第一個標記爲「真」的主人。
  2. 人發現所有嵌套的孩子。
  3. 人員發現所有標記= true的嵌套子女。
+0

如果這些是常見的疑問,我可能會改變數據庫結構 – jjj

回答

1

AFAIK實體框架不支持公用表表達式。您應該繼續使用數據庫視圖。對於我來說,讓父母和孩子看起來像這樣。

WITH Children AS 
(
    SELECT a.* 
    FROM dbo.Persons a 
    WHERE Id = 14 
    UNION ALL 
    SELECT a.* 
    FROM dbo.Persons a JOIN Children c ON a.IdParentPerson = c.id 
) 
    SELECT * 
    FROM Children 
    /*WHERE Children.Flagged = true*/ /*IF REQUIRED*/ 

WITH Parents AS 
(
    SELECT a.* 
    FROM dbo.Persons a 
    WHERE Id = 16 
    UNION ALL 
    SELECT a.* 
    FROM dbo.Persons a JOIN Parents c ON a.Id = c.IdParentPerson 
) 
    SELECT * 
    FROM Parents 
    WHERE Parents.Flagged = true 

,然後用它在DbSet像

var id = YOUR_ID; 
using(var context = new Context()) 
{ 
    var query = context.Set<GroupEntity>().SqlQuery(
    " WITH Parents AS " + 
    " (" + 
    " SELECT a.* " + 
    " FROM dbo.Persons a " + 
    " WHERE Id = @Id " + 
    " UNION ALL " + 
    " SELECT a.* " + 
    " FROM dbo.Persons a JOIN Parents c ON a.Id = c.IdParentPerson " + 
    ") " + 
    " SELECT * " + 
    " FROM Parents " + 
    " WHERE Parents.Flagged = true " 
    , new SqlParameter("@Id", id)); 
} 
+0

是的,這很好地工作了孩子和父母,但我怎麼會選擇第一個父母,有'Flagged' = true – Jaanus

+0

我已經更新了答案。從那個查詢中,您可以首先選擇'TOP(1)'。 –

+0

我如何將它與Entityframework結合?我的意思是,我可以擁有像'Person.Children()'一樣工作的方法或屬性,然後調用此存儲過程嗎? – Jaanus