Как я могу использовать составное условие в объединении в Linq? - PullRequest
1 голос
/ 15 марта 2010

Допустим, у меня есть таблица Customer с полем PrimaryContactId и полем SecondaryContactId. Оба они являются внешними ключами, которые ссылаются на таблицу Contact. Для любого данного клиента может быть сохранен один или два контакта. Другими словами, PrimaryContactId никогда не может быть NULL, но SecondaryContactId может быть NULL.

Если я перетащу свои таблицы Customer и Contact на поверхность конструирования "Linq to SQL Classes", конструктор классов обнаружит две зависимости FK от таблицы Customer до таблицы Contact, и поэтому сгенерированный класс Customer будет иметь поле Contact и поле Contact1 (которое я могу переименовать в PrimaryContact и SecondaryContact, чтобы избежать путаницы).

Теперь предположим, что я хочу получить подробную информацию обо всех контактах для данного набора клиентов.

Если бы всегда был ровно один контакт , я мог бы написать что-то вроде:

from customer in customers
join contact in contacts on customer.PrimaryContactId equals contact.id
select ...

... что бы перевести на что-то вроде:

SELECT ...
FROM Customer
INNER JOIN Contact
ON Customer.FirstSalesPersonId = Contact.id

Но , потому что я хочу объединить оба поля контакта, я хочу, чтобы SQL выглядел примерно так:

SELECT ...
FROM Customer
INNER JOIN Contact
ON Customer.FirstSalesPersonId = Contact.id OR Customer.SecondSalesPersonId = Contact.id

Как мне написать выражение Linq для этого?

Ответы [ 2 ]

4 голосов
/ 15 марта 2010

Редко правильно использовать join в LINQ to SQL .

Поскольку вы хотите контакты, почему бы не начать свой выбор там? Предполагая, что связь между Customer и Contact является двусторонней, вы должны иметь возможность написать что-то вроде:

IEnumerable<Guid> customerIds = // ...

var q = from contact in Context.Contacts
        where customerIds.Contains(contact.Customer.Id)
        select contact;
1 голос
/ 15 марта 2010

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

new { A.Foo, B.Bar } equals new { Foo = B.Baz, Bar = C.Ork }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...