2014-12-15 22 views
5

Tôi đang sử dụng Entity Framework 6 với Mã đầu tiên, và tôi có một bảng với cấu trúc sau:Entity Framework Tự Tham

public class Item 
{ 
    [Key] 
    public int ItemId { get; set; } 

    [Required] 
    [MaxLength(255)] 
    public string Name { get; set; }} 

    public Item Parent { get; set; } 
    public virtual List<Item> Children { get; set; }  
} 

Tôi muốn biết nếu nó có thể để có được trên một truy vấn đơn/chuyến vào cơ sở dữ liệu, tất cả các Items trên cây của tôi cho đến khi gốc, cung cấp một đối số itemId.

ví dụ: Hãy cho tôi tất cả phụ huynh từ ItemId 55 cho đến khi không tìm thấy cha mẹ.

+3

Tôi không nghĩ rằng đó là có thể. Có lẽ phải ánh xạ tới CTE đệ quy với proc được lưu trữ. – GraemeMiller

+0

Echoing @GraemeMiller ở đây: Tôi đã phải làm một cái gì đó tương tự gần đây, và đó là cách tôi đã kết thúc làm việc đó. – IronMan84

Trả lời

0

Bạn không thể nhận được tất cả phụ huynh trong một chuyến đi sử dụng bất kỳ mã lành mạnh nào.

Tuy nhiên bạn có thể làm một cái gì đó như thế này: https://stackoverflow.com/a/11565855/304832

Bằng cách thay đổi thực thể của bạn một chút, bạn có thể thêm 2 bộ sưu tập có nguồn gốc:

public class Item 
{ 
    [Key] 
    public int ItemId { get; set; } 

    [Required] 
    [MaxLength(255)] 
    public string Name { get; set; }} 

    public virtual Item Parent { get; set; } // be sure to make this virtual 
    public virtual List<Item> Children { get; set; } 

    public virtual ICollection<ItemNode> Ancestors { get; set; } 
    public virtual ICollection<ItemNode> Offspring { get; set; } 
} 

Bạn cần phải giới thiệu một thực thể mới để làm cho công việc này Mặc dù vậy, trông như thế này:

public class ItemNode 
{ 
    public int AncestorId { get; set; } 
    public virtual Item Ancestor { get; set; } 

    public int OffspringId { get; set; } 
    public virtual Item Offspring { get; set; } 

    public int Separation { get; set; } // optional 
} 

Bây giờ, nếu bạn muốn

tất cả các bậc cha mẹ từ ItemID 55 cho đến khi không mẹ được tìm thấy

... bạn có thể làm một cái gì đó như thế này:

IEnumerable<Item> allParentsFrom55 = dbContext.Set<Item>() 
    .Find(55).Ancestors.Select(x => x.Ancestor);