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