6

Linq To Entities uygulamasında çoktan çoğa ilişkileri sorgulamada sorun yaşıyorum. Temelde Linq kullanarak bu sorguyu çoğaltmak çalışıyorum: Ben net etrafında baktım ve gerçekten bunun nasıl herhangi uygun örnekleri bulunmayanEntity Framework - Varlıklara Linq - Çoktan Çok Sorgu Sorunları

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

. Ben var en yakın olan: bununla

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

problem müşteri birden fazla ilgi varsa olmasıdır ve bunlardan biri hepsini iade edilir ardından "Futbol" dir. Tersine problemi olan All() 'a da baktım, yani sadece bir ilgisi varsa ve futbol varsa geri dönecekler, eğer iki tane varsa ve bunlardan biri futbol olmazsa hiçbir şey iade edilmez.

Herhangi bir fikri olan var mı?

+0

bu soruya bakınız - http://stackoverflow.com/questions/1535443 ve bu yayını - http://blogs.msdn.com/b/alexj/archive/2009/10/13/tip -37-how-to-do-a-koşullu-include.aspx. – Kniganapolke

cevap

3

Ne elde etmek istediğinizden emin değilim. Müşteri ilgisi ve ilgisi olan müşterilerin bir listesi? Sorguyu yalnızca müşteri ilgisine göre başlatın.

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

Ancak bu çok fazlalıktır. Neden sadece eşleşen müşteri ilgilerini almıyoruz?

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

Diğer bilgileri, açık bir şekilde saklamak zorunda kalmadan erişmeye devam edebilirsiniz.

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

iyi bir fikir, müşteriyi tüm ilgili verilerle müşteriyi tek bir db isabeti ile sorgu tabanı olarak kullanmaktır. İade edilen veriler serileştirilecek ve tek bir wcf çağrısında müşteriye (bir müşteri bakım ekranı için) iade edilecektir. İstemciyi ince ve mümkün olduğunca genel olarak tutmaya çalışırken, istemci edmx'teki varlıklar hakkında bir fikri yoktur, yalnızca serileştirilmiş xml ile çalışır ve bununla çalışır. Anonim türlerden kaçınmaya ve yalnızca bir nesne ile eşleşen ilgili verileri içeren bir Müşteri nesnesini döndürmeye çalışıyorum. –

1

Genel olarak tutmaya çalışıyorsanız, daha iyi bir yol varlık sql ile gitmektir [Esql]. Coz L2E, linq sorgusundaki koleksiyonlar için desteklemiyor.

Sen

customer.Interests.Where (faiz => interest.Name == 'FootBall') kullanamazsınız

sorgu şu şekilde görünecektir ..

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

Umarım yardımcı olur!

+0

Çözümler için esql'e düşmek, bir hack gibi hissetmiyor mu? Bütün zekayı ve EF'yi kullanma noktasında olması gereken her şeyi kaybedersiniz. Bu noktada bir DbReader'da çalıştırılabilir. –

+0

Evet .. ancak ADO'da DbReader tarafından döndürülen Veri Kayıtlarına kıyasla EF'de bir Yazılı Varlık Müşterisi alıyorsunuz. –

0

LINQT için çok şey var. Veritabanınızda bir görünüm kullanmayı deneyin veya Deepak N'nin dediği gibi çalışın. En

7

bu deneyin, bu yardımcı olur

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

Umut,

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;