2016-02-11 4 views
0
Table: Users 
ID123 John Doo 
ID345 John Woo 

Table: Contacts 
ID123 Microsoft [email protected] +1-234567 
ID345 Private Co [email protected] +9-654321 
ID345 IBM  [email protected]  +1-456789 

Run SQL:Простой оператор Sql в Linq?

SELECT FirstName, LastName, CompanyName 
FROM Users INNER JOIN Contacts ON User.Id = Contacts.UserId 
WHERE (FirstName = 'John' AND CompanyName = 'Microsoft') OR CompanyName = 'IBM' 

Мы получаем следующие результаты:

John Doo Microsoft 
John Woo IBM 

Довольно просто до сих пор, не так ли? Теперь, давайте напишем это в C# Lambda или Linq:

conn.Users.Where(user => 
(user.FirstName=="John" && user.Contacts.Any(contact => contact.CompanyName=="Microsoft")) 
|| user.Contacts.Any(contact => contact.CompanyName=="IBM")) 
.Select(......); 

Мой вопрос, что мы помещаем в Select() заявление в конце, чтобы достичь того же результата установить?

+0

Используйте анонимные объекты. –

ответ

1

ON User.Id = Contacts.UserId указывает, что у вас есть отношение 1..* от User до Contact.

Это означает, что с Linq, вы должны начать с запрашивая Contacts, а не Users, так как результат будет иметь ряд на контакт, а не подряд для каждого пользователя.

Что-то, как это будет работать:

conn.Contacts 
    .Where(c => c.CompanyName == "IBM" || 
       (c.CompanyName == "Microsoft" && c.User.FirstName == "John")) 
    .Select(c => new { c.User.FirstName, c.User.LastName, c.CompanyName }) 
+0

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

+1

@Tom Можете ли вы немного разобраться? На чем вы работаете в режиме отдельного/пейджинга? Пейджинг не будет работать при запросе «Пользователи» (представьте, что вы настроили пейджинг на 10, а у одного пользователя было 100 контактов?). Пожалуйста, отредактируйте вопрос, чтобы включить практический пример проблемы, с которой вы сталкиваетесь, поэтому ответы могут быть более точными :) – Rob

+0

спасибо, что указали это, я не могу разоблачить всю масштабность проекта. Но я пересматриваю способ использования этого запроса для достижения того, что я пытаюсь сделать. Я приму ваш ответ и подумаю, что делать с моим делом. – Tom

Смежные вопросы