Bao gồm một số tài liệu tham khảo ở cấp độ thứ hai


88

Giả sử chúng ta có mô hình này:

public class Tiers
{
    public List<Contact> Contacts { get; set; }
}

public class Contact
{
    public int Id { get; set; }
    public Tiers Tiers { get; set; }
    public Titre Titre { get; set; }
    public TypeContact TypeContact { get; set; }
    public Langue Langue { get; set; }
    public Fonction Fonction { get; set; }
    public Service Service { get; set; }
    public StatutMail StatutMail { get; set; }
}

Với EF7, tôi muốn truy xuất tất cả dữ liệu từ bảng Tiers, với dữ liệu từ bảng Liên hệ, từ bảng Titre, từ bảng TypeContact, v.v. bằng một lệnh duy nhất. Với API Bao gồm / ThenInclude, tôi có thể viết một cái gì đó như sau:

_dbSet
     .Include(tiers => tiers.Contacts)
          .ThenInclude(contact => contact.Titre)
     .ToList();

Nhưng sau thuộc tính Titre, tôi không thể bao gồm các tham chiếu khác như TypeContact, Langue, Fonction ... Phương thức include gợi ý đối tượng Tiers và ThenInclude đề xuất đối tượng Titre, nhưng không phải đối tượng Liên hệ. Làm cách nào tôi có thể bao gồm tất cả các tham chiếu từ danh sách Liên hệ của mình? Chúng ta có thể đạt được điều này với một chỉ dẫn duy nhất không?

Câu trả lời:


154

.ThenInclude()sẽ tách chuỗi cuối cùng .ThenInclude()hoặc cuối cùng .Include()(tùy theo cái nào gần đây hơn) để kéo theo nhiều cấp độ. Để bao gồm nhiều anh chị em ở cùng cấp, chỉ cần sử dụng một .Include()chuỗi khác . Định dạng đúng mã có thể cải thiện đáng kể khả năng đọc.

_dbSet
    .Include(tiers => tiers.Contacts).ThenInclude(contact => contact.Titre)
    .Include(tiers => tiers.Contacts).ThenInclude(contact => contact.TypeContact)
    .Include(tiers => tiers.Contacts).ThenInclude(contact => contact.Langue);
    // etc.

3
BTW, câu hỏi này đã truyền cảm hứng cho tôi tạo ra số 2124
bricelam,

tại sao không: var contacts = _dbSet.Include(tiers => tiers.Contacts); contacts.ThenInclude(contact => contact.Titre); contacts.ThenInclude(contact => contact.TypeContact); contacts.ThenInclude(contact => contact.Langue); Điều đó sẽ không hoạt động?
Doug

1
@Doug Không, bạn sẽ tạo các Queryableđối tượng mới mỗi lần và không bao giờ đánh giá chúng. contactssẽ chỉ có giá trị ban đầu mà bạn đã gán cho nó.
bricelam

nếu tiers.Contactslà một List<T>? làm thế nào bạn sẽ chỉ định mục sau đó?
shashwat

2
Giải pháp này hoạt động nhưng câu lệnh SQL kết quả dẫn đến ba THAM GIA TRÁI với Danh bạ (ít nhất là theo kinh nghiệm của tôi). Điều đó là khủng khiếp không hiệu quả. Có phải là một cách tốt hơn.
EL MOJO

7

Vì sự hoàn chỉnh 'vì lợi ích:

Cũng có thể bao gồm các thuộc tính lồng nhau trực tiếp Include trong trường hợp chúng không phải là thuộc tính tập hợp như vậy:

_dbSet
    .Include(tier => tier.Contact.Titre)
    .Include(tier => tier.Contact.TypeContact)
    .Include(tier => tier.Contact.Langue);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.