Khung thực thể Tham gia 3 Bảng


133

Tôi đang cố gắng tham gia ba bảng nhưng tôi không thể hiểu phương pháp ...

Tôi đã hoàn thành tham gia 2 bảng

        var entryPoint = dbContext.tbl_EntryPoint
            .Join(dbContext.tbl_Entry,
                c => c.EID,
                cm => cm.EID,
                (c, cm) => new
                {
                    UID = cm.OwnerUID,
                    TID = cm.TID,
                    EID = c.EID,
                }).
            Where(a => a.UID == user.UID).Take(10);

những cái bàn

Tôi muốn bao gồm bảng tbl_Title với TID PK và nhận trường Tiêu đề .

Cảm ơn rất nhiều


Kiểm tra bài viết liên quan này. Nó không sử dụng ký hiệu Phương thức, nhưng, bạn sẽ có thể nhận được ý chính ... stackoverflow.com/questions/11204367/ trên
xspydr

Vui lòng hiển thị một hình ảnh với các thuộc tính điều hướng mở rộng. Thuộc tính điều hướng là tham gia làm sẵn.
Gert Arnold

Câu trả lời:


202

Tôi nghĩ sẽ dễ dàng hơn khi sử dụng truy vấn dựa trên cú pháp:

var entryPoint = (from ep in dbContext.tbl_EntryPoint
                 join e in dbContext.tbl_Entry on ep.EID equals e.EID
                 join t in dbContext.tbl_Title on e.TID equals t.TID
                 where e.OwnerID == user.UID
                 select new {
                     UID = e.OwnerID,
                     TID = e.TID,
                     Title = t.Title,
                     EID = e.EID
                 }).Take(10);

Và bạn có lẽ nên thêm orderbymệnh đề, để đảm bảo Top(10)trả về đúng mười mục hàng đầu.


3
Cảm ơn bạn rất nhiều cho phương pháp; hoạt động rõ ràng nhưng tôi muốn xem câu trả lời như tôi đã hỏi, cảm ơn rất nhiều lần nữa.
Erçin Dedeoğlu

@MarcinJuraszek: nếu tôi cần ViewModel để hoạt động, tôi có cần tham gia các bảng không?
Vini

Điều này không hoạt động ngay cả khi không có async. Tôi có kịch bản chính xác nhưng truy vấn đưa ra một ngoại lệ [the_list_of_all_return_variables] 'không thể được nối tiếp. @marcinJuraszek - Bạn có thể xem stackoverflow.com/questions/42453123/ Lời
sandiejat

1
HOÀN HẢO! bạn đã tiết kiệm cho tôi rất nhiều thời gian :)
MohammadHossein R

81

Điều này chưa được kiểm tra, nhưng tôi tin rằng cú pháp sẽ hoạt động cho truy vấn lambda. Khi bạn tham gia nhiều bảng hơn với cú pháp này, bạn phải đi sâu hơn vào các đối tượng mới để đạt được các giá trị bạn muốn thao tác.

var fullEntries = dbContext.tbl_EntryPoint
    .Join(
        dbContext.tbl_Entry,
        entryPoint => entryPoint.EID,
        entry => entry.EID,
        (entryPoint, entry) => new { entryPoint, entry }
    )
    .Join(
        dbContext.tbl_Title,
        combinedEntry => combinedEntry.entry.TID,
        title => title.TID,
        (combinedEntry, title) => new 
        {
            UID = combinedEntry.entry.OwnerUID,
            TID = combinedEntry.entry.TID,
            EID = combinedEntry.entryPoint.EID,
            Title = title.Title
        }
    )
    .Where(fullEntry => fullEntry.UID == user.UID)
    .Take(10);

17
Thật là gớm ghiếc. Nếu tôi tìm thấy một truy vấn như vậy trong mã sản xuất, tôi sẽ ngay lập tức tái cấu trúc nó. +1 để trả lời câu hỏi khi được hỏi, mặc dù!
Dan Bechard

8
@Dan vì tò mò có phải chỉ là không nghĩ ra tất cả các quy ước đặt tên với c, cm và ccm, hay đơn giản là cú pháp cần thiết để thực hiện các phép nối bằng linq và lambda có gớm ghiếc không? Nếu trước đây, và bạn muốn chỉnh sửa bài đăng để có bố cục tốt hơn, bằng mọi cách phải có nó. Tôi vẫn chưa quen với khung thực thể và vẫn đang tiếp thu các thực tiễn tốt nhất vì vậy nếu bạn có đề xuất để làm cho câu trả lời này trở nên hùng hồn hơn cho người dùng trong tương lai, tôi sẽ đánh giá cao sự hỗ trợ.
Pynt 22/03/2016

4
Tôi đã không đưa ra lý do chính xác nhiều khi tôi bình luận, nhưng chắc chắn các quy ước đặt tên làm tổn thương khả năng đọc (obv. Sao chép từ OP). Ngoài ra, dấu phẩy như phần đầu của dòng làm tổn thương khả năng đọc rất nhiều (chủ quan, đối với tôi), và khoảng trắng / thụt đầu dòng có thể được cải thiện đôi chút. Tôi đã gửi một bản chỉnh sửa với tất cả những cải tiến (IMHO) này kể từ khi bạn yêu cầu.
Dan Bechard

2
Định dạng mã thường bị sai lệch, nhưng có những điều chung mà hầu hết mọi người đồng ý trông tốt hơn. Đối với quy ước đặt tên, tôi thường gọi những thứ thực sự ngắn, nhưng tôi có thể gõ đủ nhanh ngay cả bây giờ (thậm chí không xem xét những thứ như Intellisense) rằng một vài ký tự được lưu không có giá trị về khả năng đọc so với đặt tên một cách rõ ràng, ví dụ như "EntryID" so với "EID", "kết hợpEntry" so với "cm", v.v ... Cuối cùng, một người khác sẽ đọc mã của tôi, và tôi muốn họ không ghét tôi như là một hàm tuyến tính của số dòng của tôi mã họ đã phải đọc / duy trì.
Dan Bechard

5
Tôi chỉ không nhận được các đối số chống lại dấu phẩy bắt đầu. Tôi là một người tin tưởng vững chắc, vì nó làm cho việc bình luận các mệnh đề / lập luận riêng lẻ thực sự dễ dàng. Và nó trông đẹp hơn :-)
Auspex
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.