6

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

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(), у которого есть обратная проблема, то есть вернется, только если у них есть интерес, и это футбол, если у них есть два, а один из них - не футбол, ничего не возвращается.

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

+0

Пожалуйста, посмотрите на этот вопрос - http://stackoverflow.com/questions/1535443 и этот пост - http://blogs.msdn.com/b/alexj/archive/2009/10/13/tip -37-как-дела-а-условного-include.aspx. – Kniganapolke

ответ

3

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

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); 
} 
+0

Идея состоит в том, чтобы вернуть клиента со всеми связанными данными, используя клиента в качестве основы запроса с одним ударом db. Возвращенные данные будут сериализованы и возвращены клиенту (для экрана обслуживания клиентов) в одном вызове wcf. Поскольку мы стараемся, чтобы клиент был тонким и как можно более общим, клиент не имеет понятия об объектах в edmx, он просто работает с десериализованным xml и работает с ним. Я пытаюсь избежать анонимных типов и возвращать объект Customer только с соответствующими данными, которые соответствуют предложению where. –

1

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

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

customer.Interests.Where ('FootBall Интересов => interest.Name ==)

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

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

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

+0

Не бросается ли в esql для решений, просто чувствую себя взломанным? Вы теряете все свои intellisense и почти все, что должно было бы использовать EF. Также можно выполнить его в DbReader в этот момент. –

+0

Да, но вы получаете типизированный клиент Entity в EF по сравнению с Data Records, возвращаемый DbReader в ADO. –

0

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

7

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

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

Надеется, что это помогает,

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; 
Смежные вопросы