6

Tôi đang gặp sự cố khi truy vấn các mối quan hệ nhiều-nhiều trong LINQ to Entities. tôi về cơ bản cố gắng để tái truy vấn này sử dụng LINQ:Khuôn khổ thực thể - LINQ đối với thực thể - Các vấn đề truy vấn nhiều-nhiều-nhiều

Select * 
FROM Customer 
LEFT JOIN CustomerInterest ON Customer.CustomerID = CustomerInterest.CustomerID 
LEFT JOIN Interest ON CustomerInterest.InterestID = Interest.InterestID 
WHERE Interest.InterestName = 'Football' 

Tôi đã nhìn quanh lưới và không thực sự tìm thấy bất kỳ ví dụ thích hợp như thế nào để làm điều này. Gần nhất tôi có được là:

List<Customer> _Customers = (from _LCustomers in _CRM.Customer.Include("CustomerInterest.Interest") 
            where _LCustomers.CustomerInterest.Any(x => x.Interest.InterestName == "Football") 
            select _LCustomers).ToList(); 

Vấn đề là nếu khách hàng có nhiều hơn một sở thích và một trong số đó là "Bóng đá" thì tất cả đều được trả lại. Tôi cũng đã xem xét All() có vấn đề nghịch đảo, tức là sẽ chỉ trở lại nếu họ có một sở thích và đó là bóng đá, nếu họ có hai và một trong số họ không phải là bóng đá thì không có gì được trả lại.

Bất kỳ ai có ý tưởng nào?

+0

Vui lòng xem câu hỏi này - http://stackoverflow.com/questions/1535443 và bài đăng này - http://blogs.msdn.com/b/alexj/archive/2009/10/13/tip -37-how-to-do-a-điều kiện-include.aspx. – Kniganapolke

Trả lời

3

Tôi không chắc chắn những gì bạn muốn có được. Danh sách khách hàng có quan tâm và quan tâm của khách hàng? Chỉ cần bắt đầu truy vấn theo sở thích của khách hàng.

context.CustomerInterest. 
    Where(ci => ci.Interest.InterestName == "Football"). 
    Select(ci => new 
    { 
     Customer = ci.Customer, 
     CustomerInterest = ci, 
     Interest = ci.Interest 
    }); 

Nhưng điều này rất thừa. Tại sao không chỉ nhận được lợi ích của khách hàng phù hợp?

IEnumerable<CustomerInterest> customerInterests = context.CustomerInterest. 
    Where(ci => ci.Interest.InterestName == "Football"); 

Bạn vẫn có thể truy cập thông tin khác mà không cần lưu trữ thông tin một cách rõ ràng.

foreach (CustomerInterest customerInterest in customerInterests) 
{ 
    DoSomething(customerInterest); 
    DoSomething(customerInterest.Customer); 
    DoSomething(customerInterest.Interest); 
} 
+0

cũng là ý tưởng là trả lại khách hàng với tất cả dữ liệu liên quan bằng cách sử dụng khách hàng làm cơ sở của truy vấn với một lần truy cập db duy nhất. Dữ liệu được trả về sẽ được tuần tự hóa và trả về cho khách hàng (cho một màn hình bảo trì khách hàng) trong một cuộc gọi wcf duy nhất. Vì chúng tôi đang cố giữ khách hàng mỏng và càng chung càng tốt thì khách hàng không có khái niệm về thực thể trong edmx, nó chỉ hoạt động với xml deserialized và làm việc với nó. Tôi đang cố gắng tránh các loại ẩn danh và trả về đối tượng Khách hàng chỉ với dữ liệu có liên quan khớp với mệnh đề where. –

1

Nếu bạn cố gắng giữ cho nó chung chung, cách tốt hơn là đi với thực thể sql [Esql]. Coz L2E không hỗ trợ vị trí cho các bộ sưu tập trong truy vấn LINQ.

Bạn không thể sử dụng

customer.Interests.Where (lãi suất => interest.Name == 'FootBall')

Truy vấn sẽ trông như thế này ..

context.CreateQuery(@"SELECT VALUE Customer FROM Customer WHERE EXISTS(SELECT VALUE FROM CustomerInterest WHERE CustomerInterest.Ineterest.Name = 'FootBall')).Include("Interest");

hy vọng nó giúp!

+0

Không giảm xuống esql cho các giải pháp chỉ cảm thấy như một hack mặc dù? Bạn mất tất cả intellisense của bạn và chỉ là về tất cả mọi thứ được cho là điểm của việc sử dụng EF. Cũng có thể thực hiện nó trong một DbReader tại thời điểm đó. –

+0

Vâng .. nhưng bạn nhận được một thực thể khách hàng được đánh máy trong EF so với bản ghi dữ liệu được trả về bởi DbReader trong ADO. –

0

Điều đó rất nhiều đối với LINQT. Hãy thử sử dụng chế độ xem tại cơ sở dữ liệu của bạn hoặc làm việc như Deepak N đã nói. nhất

7

Hãy thử điều này,

var result = from c in ctx.Customer 
      from i in c.Interest 
      where i.InterestName == "Football" 
      select c; 

Hope this helps,

Ray.

2
 var results = from c in _CRM.Customer 
         from ci in c.Interests 
         join i in _CRM.Interests 
         on ci.ID equals i.ID 
         where i.Interest = "Football" 
         select c; 
Các vấn đề liên quan