2009-08-13 31 views
5

Tôi có 2 bảng có tàu quan hệ với nhauLàm cách nào để thực hiện điều này trong Entity Framework (nhiều nơi hoặc Tham gia)?

Bảng A có mối quan hệ 1 đến nhiều với bảng B, do đó, điều này tạo ra một thuộc tính điều hướng trong mỗi bảng.

Bây giờ tôi cần kiểm tra giá trị từ Bảng A (tên người dùng) và tôi cần kiểm tra giá trị từ bảng B (ClubId).

Vì vậy, trong tâm trí của tôi nó sẽ là một cái gì đó giống như

Join the tables together 
Where A.userName == "bob" && 
where B.clubId == "Car" 

// return the count. 

nhưng bây giờ tôi biết với Entity thứ nó nên tham gia ít phổ biến vì vậy tôi tự hỏi nếu tôi có thể làm điều đó với một tham gia sau đó.

Tôi cố gắng này

int count = Entity.TableA.where(a => a.userName == "bob" && a.TableB.where(i => i.ClubId == "Car")).Count(); 

vì vậy đây không làm việc vì nó sẽ không trở lại đúng loại (thứ 2 ở đâu). Đây chỉ là cách tôi nghĩ dọc theo các dòng như thế nào tôi mong đợi nó sẽ được thực hiện sẽ làm việc.

Vậy nó trông như thế nào?

P.S

Tôi muốn có ví dụ được thực hiện trong truy vấn phương thức LINQ như tôi đã làm ở trên.

Trả lời

4

Filtering TableA trước khi tham gia của bạn có lẽ là hiệu quả hơn:

var clubs = from a in Entity.TableA 
      where a.userName == "bob" 
      from b in a.TableB 
      where b.clubId == "Car" 
      select b; 

var count = clubs.Count(); 

Bạn không cần phải sử dụng hai biến, nó chỉ là sở thích của tôi ở đây cho rõ ràng.

Hoặc trong cú pháp phương pháp bạn có thể đơn giản hóa một chút:

var count = Entity.TableA.Where(a => a.userName == "bob") 
         .SelectMany(a => a.TableB) 
         .Count(b => b.clubId == "Car"); 

Tuy nhiên, tôi không chắc chắn EF hiểu những biểu hiện cụ thể. Nếu không, trình biên dịch sẽ dịch truy vấn trên như sau:

var count = Entity.TableA.Where(a => a.userName == "bob") 
         .SelectMany(a => a.TableB, (a,b) => new { a, b }) 
         .Where(x => x.b.clubId == "Car") 
         .Count(); 
+0

Ah. Chà. Tôi không chắc chắn những gì tôi thích tốt hơn trong trường hợp của mình. Lựa chọn đó Nhiều người ném tôi đi. Vậy điều gì sẽ xảy ra nếu tôi cần một bộ lọc khác? Tôi có thể thêm một công ty khác không? Vâng cú pháp phương pháp đầu tiên hoạt động Tôi không biết nếu nó đi xuống nội bộ và làm điều thứ hai. Tất cả các truy vấn sẽ có cùng thời gian thực hiện. Điểm chọn thứ hai trong SelectMany thứ hai. giống như a => a.TableB, (a, b) =>) làm gì? – chobo2

+0

Tôi đã cập nhật bài đăng với bản sửa lỗi trong bản dịch truy vấn. SelectMany đầu tiên về cơ bản "làm phẳng" bộ sưu tập lồng nhau của bạn, trả về một chuỗi tất cả B từ tất cả A. SelectMany thứ hai chấp nhận hai đại biểu, một "collectionSelector" để lấy bộ sưu tập của B từ A và một "resultSelector" để xác định giá trị trả về cho A và B.LINQ chỉ chọn cả hai đối tượng đầu vào, để sử dụng trong phần còn lại của truy vấn của bạn. – dahlbyk

5

Giả sử mô hình EF của bạn có mối quan hệ giữa người sử dụng và Câu lạc bộ có thể làm một cái gì đó như thế này:

var usersNamedBobInCarClub = 
      from A in User 
      from B in A.Clubs 
      where A.userName == "bob" && 
        B.clubId == "Car" 
      select A; 

Nếu bạn muốn quay trở lại các yếu tố của cả người sử dụng và Câu lạc bộ có một cái nhìn tại gia nhập trong truy vấn.

+0

Tôi sẽ thử điều đó nhưng làm cách nào để thực hiện điều đó trong truy vấn phương thức LINQ? – chobo2

Các vấn đề liên quan