Entity Framework - Linq To Entities - Проблемы со многими запросами - PullRequest
6 голосов
/ 27 апреля 2009

У меня проблемы с запросом отношений «многие ко многим» в Linq To Entities. Я в основном пытаюсь повторить этот запрос с помощью Linq:

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

Я осмотрел сеть и не нашел подходящих примеров, как это сделать. Ближайшее, что у меня есть, это:

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

Проблема в том, что если у клиента есть более одного интереса, и один из них - «Футбол», то все они возвращаются. Я также посмотрел на All (), у которого есть обратная проблема, то есть вернется, только если у них есть один интерес, и это футбол, если у них два, и один из них не футбол, ничего не возвращается.

У кого-нибудь есть идеи?

Ответы [ 5 ]

7 голосов
/ 26 июля 2009

Попробуйте это,

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

Надеюсь, это поможет,

Ray.

3 голосов
/ 27 апреля 2009

Я не уверен, что вы хотите получить. Список клиентов с интересом клиента и интерес? Просто запустите запрос на интерес клиента.

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

Но это очень избыточно. Почему бы просто не получить соответствующие интересы клиента?

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

Вы по-прежнему можете получить доступ к другой информации, не сохраняя ее явно.

foreach (CustomerInterest customerInterest in customerInterests)
{
   DoSomething(customerInterest);
   DoSomething(customerInterest.Customer);
   DoSomething(customerInterest.Interest);
}
2 голосов
/ 15 октября 2010
        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;
1 голос
/ 04 мая 2009

Если вы пытаетесь сделать его универсальным, лучше выбрать сущность sql [Esql]. Coz L2E не поддерживает, где для коллекций в запросе linq.

Вы не можете использовать

customer.Interests.Where (интереса => интереса. Имя == 'FootBall')

Запрос будет выглядеть следующим образом ..

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

надеюсь, это поможет!

0 голосов
/ 16 июня 2009

Это очень много для LINQT. Попробуйте использовать представление в вашей базе данных или работать так, как сказал Дипак Н. Лучший

...