Linq2Sql Как написать запрос внешнего соединения? - PullRequest
0 голосов
/ 10 апреля 2010

У меня есть следующие таблицы SQL.

ImportantMessages

impID

Сообщение

ImportantMessageUsers

imuID

imuUserID

imuImpID

Я хочу написать запрос Linq2Sql, чтобы он возвращал все строки из ImportantMessages у которого нет записи в ImportantMessagesUsers.

Соответствующие поля impID ----- imuImpID

Предположим, что imuUserID равен 6

Ответы [ 3 ]

2 голосов
/ 10 апреля 2010

Это было бы так же просто, как

var messages = context.ImportantMessages.Where(x => x.ImportantMessageUsers.Count() == 0);

EDIT

Мне кажется, я хорошо понял проблему, вам нужно получить все сообщения из таблицы ImportantMessages без какой-либо строки в таблице ImportantMessageUsers, которая связана с внешним ключом ImportantMessagesUsers.imuImpID = ImportantMessages.impID.

Пожалуйста, проверьте, есть ли у вас внешний ключ между этими таблицами, а затем удалите эти таблицы из конструктора контекста Linq и добавьте их снова - внешний ключ должен быть виден между ними, создавая такие свойства как ImportantMessages.ImportantMessageUsers, который имеет тип IEnumerable ImportantMessageUser, позволяющее использовать выражения типа x.ImportantMessageUsers.Count () == 0.

EDIT2

Когда идентификатор пользователя должен быть отфильтрован, это лямбда-выражение должно сработать:

var messages = context.ImportantMessages.Where(x => x.ImportantMessageUsers.Where(y => y.imuUserID == 6).Count() == 0);

Использование лямбды над нотацией LINQ является лишь вопросом предпочтения, однако, когда многократные объединения не требуются, лямбда, как правило, более интуитивно понятна.

1 голос
/ 10 апреля 2010

Вот что у меня сработало.

var qry = from imp in ImportantMessages
where !(from imu in ImportantMessagesUsers where imu.ImuUsrID == 6 select imu.ImuImpID).Contains(imp.ImpID)
select imp;
1 голос
/ 10 апреля 2010

Проверить DefaultIfEmpty ().

Вот пример из одного из моих старых вопросов SO:

LINQ to SQL - Как добавить предложение where к левому соединению?

var z = 
    from im in importantMessages
    join imu in importantMessageUsers
        on new { im.impID,  imuUserID = 7 } equals 
        new { imu.imuImpID, imu.imuUserID  }
    into imJoin
    from ij in imJoin.DefaultIfEmpty()
    where ij.imuImpID == null
    select new
    {
        im.Message
        ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...