Мне нужно получить все идентификаторы из двух столбцов, которые не содержат другого списка. Например: если у меня есть переменная:

Мне нужно выбрать список строк во всех уведомлениях по DeliveryTypeId и NotificationGroupId, где те идентификаторы, которые не содержатся в парной комбинации в выбранных уведомлениях.

var selectedNotifications = _dbContext.UserNotificationTypeDeliveryChoice.Include(m => m.NotificationGroup)
                            .Include(m => m.DeliveryType)
                            .Where(m => m.UserDefId == userDefId && m.UserTypeId == (int)userType)
                            .Select(m => new NotificationGroup()
                            {
                                NotificationGroupId = m.NotificationGroup.NotificationGroupId,
                                Name = m.NotificationGroup.Name,
                                DefaultDeliveryType = new DeliveryType()
                                {
                                    DeliveryTypeId = m.DeliveryType.DeliveryTypeId,
                                    Name = m.DeliveryType.Name,
                                    HasChoosen = true
                                }
                            }).ToList();

var selectedNotificationsMatchingIds = selectedNotifications.Select(n => new { n.NotificationGroupId, n.DefaultDeliveryType.DeliveryTypeId }).ToList();

И мне нужно условие, которое возьмет все строки из базы данных, где есть! Содержит.

Пример:

//Список кодов группы уведомлений

+---------------------+-------------+-----------------------+
| NotificationGroupId |    Name     | DefaultDeliveryTypeId |
+=====================+=============+=======================+
| 1                   | Comments    | 1                     |
+---------------------+-------------+-----------------------+
| 2                   | QA          | 1                     |
+---------------------+-------------+-----------------------+
| 3                   | Services    | 1                     |
+---------------------+-------------+-----------------------+
| 4                   | eScheduling | 1                     |
+---------------------+-------------+-----------------------+
| 5                   | eDelivery   | 2                     |
+---------------------+-------------+-----------------------+

//Список кодов типов доставки

+----------------+-----------------+
| DeliveryTypeId |      Name       |
+================+=================+
| 1              | SMS             |
+----------------+-----------------+
| 2              | Email           |
+----------------+-----------------+
| 3              | PortalMessaging |
+----------------+-----------------+

//ИЗБРАННЫЕ УВЕДОМЛЕНИЯ

+--------------------------------------+-----------+----------------------------+---------------------+----------------+------------+
| UserNotificationTypeDeliveryChoiceId | UserDefID | UserCompanyOrInstitutionId | NotificationGroupId | DeliveryTypeId | UserTypeId |
+======================================+===========+============================+=====================+================+============+
| 269                                  | 2933      | NULL                       | 1                   | 2              | 1          |
+--------------------------------------+-----------+----------------------------+---------------------+----------------+------------+
| 270                                  | 2933      | NULL                       | 2                   | 2              | 1          |
+--------------------------------------+-----------+----------------------------+---------------------+----------------+------------+
| 271                                  | 2933      | NULL                       | 3                   | 2              | 1          |
+--------------------------------------+-----------+----------------------------+---------------------+----------------+------------+
| 272                                  | 2933      | NULL                       | 4                   | 2              | 1          |
+--------------------------------------+-----------+----------------------------+---------------------+----------------+------------+
| 273                                  | 2933      | NULL                       | 4                   | 1              | 1          |
+--------------------------------------+-----------+----------------------------+---------------------+----------------+------------+

//ВСЕ УВЕДОМЛЕНИЯ

+-----------------------------+-------------------------------+------------+---------------------+------------------------+-------------------------+----------------+
| NotificationGroupUserTypeId | NotificationGroupChangeTypeId | UserTypeId | NotificationGroupId | NotificationTemplateId |       DateCreated       | DeliveryTypeId |
+=============================+===============================+============+=====================+========================+=========================+================+
| 1                           | NULL                          | 1          | 1                   | 14                     | NULL                    | 1              |
+-----------------------------+-------------------------------+------------+---------------------+------------------------+-------------------------+----------------+
| 6                           | 11                            | 1          | 4                   | 21                     | 2011-07-18 11:13:23.543 | 2              |
+-----------------------------+-------------------------------+------------+---------------------+------------------------+-------------------------+----------------+
| 17                          | NULL                          | 1          | 4                   | 6                      | NULL                    | 2              |
+-----------------------------+-------------------------------+------------+---------------------+------------------------+-------------------------+----------------+
| 26                          | NULL                          | 1          | 3                   | 8                      | NULL                    | 2              |
+-----------------------------+-------------------------------+------------+---------------------+------------------------+-------------------------+----------------+
| 30                          | 11                            | 1          | 4                   | 15                     | 2011-07-17 13:16:36.897 | 1              |
+-----------------------------+-------------------------------+------------+---------------------+------------------------+-------------------------+----------------+
| 31                          | 14                            | 1          | 4                   | 16                     | 2011-07-17 13:17:00.880 | 1              |
+-----------------------------+-------------------------------+------------+---------------------+------------------------+-------------------------+----------------+
| 32                          | 15                            | 1          | 4                   | 17                     | 2011-07-17 13:17:18.220 | 1              |
+-----------------------------+-------------------------------+------------+---------------------+------------------------+-------------------------+----------------+
| 33                          | 16                            | 1          | 4                   | 18                     | 2011-07-17 13:17:34.833 | 1              |
+-----------------------------+-------------------------------+------------+---------------------+------------------------+-------------------------+----------------+
| 34                          | 17                            | 1          | 4                   | 19                     | 2011-07-17 13:17:58.337 | 1              |
+-----------------------------+-------------------------------+------------+---------------------+------------------------+-------------------------+----------------+
| 35                          | 18                            | 1          | 4                   | 20                     | 2011-07-17 13:18:35.960 | 1              |
+-----------------------------+-------------------------------+------------+---------------------+------------------------+-------------------------+----------------+
| 36                          | 14                            | 1          | 4                   | 22                     | 2011-07-18 16:00:27.320 | 2              |
+-----------------------------+-------------------------------+------------+---------------------+------------------------+-------------------------+----------------+
| 37                          | 15                            | 1          | 4                   | 23                     | 2011-07-18 16:01:17.843 | 2              |
+-----------------------------+-------------------------------+------------+---------------------+------------------------+-------------------------+----------------+
| 38                          | 16                            | 1          | 4                   | 24                     | 2011-07-18 16:01:36.300 | 2              |
+-----------------------------+-------------------------------+------------+---------------------+------------------------+-------------------------+----------------+
| 39                          | 17                            | 1          | 4                   | 25                     | 2011-07-18 16:01:55.923 | 2              |
+-----------------------------+-------------------------------+------------+---------------------+------------------------+-------------------------+----------------+
| 40                          | 18                            | 1          | 4                   | 26                     | 2011-07-18 16:02:12.607 | 2              |
+-----------------------------+-------------------------------+------------+---------------------+------------------------+-------------------------+----------------+
| 41                          | 8                             | 1          | 3                   | 27                     | 2011-11-09 12:59:51.307 | 2              |
+-----------------------------+-------------------------------+------------+---------------------+------------------------+-------------------------+----------------+
| 44                          | 19                            | 1          | 3                   | 28                     | 2011-12-21 14:57:31.780 | 2              |
+-----------------------------+-------------------------------+------------+---------------------+------------------------+-------------------------+----------------+
| 48                          | 20                            | 1          | 5                   | 29                     | 2011-12-23 10:19:16.840 | 2              |
+-----------------------------+-------------------------------+------------+---------------------+------------------------+-------------------------+----------------+
| 49                          | 1                             | 1          | 3                   | 6                      | 2011-12-22 16:09:15.047 | 2              |
+-----------------------------+-------------------------------+------------+---------------------+------------------------+-------------------------+----------------+

Итак, я получаю selectedNotifications правильных пар, но затем, когда я пытаюсь отфильтровать свой новый запрос, я получаю только две пары, но я должен их получить (с этим примером):

var notSelectedNotifications = _dbContext.NotificationGroupUserType.Include(m => m.DeliveryType)
                                .Include(m => m.NotificationGroup)
                                .Where(m => m.UserTypeId == (int)userType)
                                .Where(m => !selectedNotificationsMatchingIds.Contains(new { m.NotificationGroup.NotificationGroupId, m.DeliveryType.DeliveryTypeId }))
                                .Select(m => new NotificationGroup()
                                {
                                    NotificationGroupId = m.NotificationGroupId,
                                    Name = m.NotificationGroup.Name,
                                    DefaultDeliveryType = new DeliveryType()
                                    {
                                        DeliveryTypeId = m.DeliveryType.DeliveryTypeId,
                                        Name = m.DeliveryType.Name,
                                        HasChoosen = false
                                    }
                                }).ToList();

Любые советы приветствуются. Если кто-то может сказать мне, как получить все это, что не выбрано в selectedNotificationsMatchingIds

1
Stefan0309 13 Дек 2019 в 17:04
1
Я попытался отредактировать разделы кода, чтобы сделать их более разборчивыми. Не помогло то, что все строки, кроме двух, не были видны на странице нормальной ширины.
 – 
Martin
13 Дек 2019 в 17:11
ГДЕ неправильно. Вы хотите НЕ, а ГДЕ дает EQUAL : .Where(m => m.UserDefId == userDefId && m.UserTypeId == (int)userType)
 – 
jdweng
13 Дек 2019 в 17:32
Но я поставил !Содержит, я добавил отрицание.
 – 
Stefan0309
13 Дек 2019 в 17:34
1
Сначала попробуйте без ГДЕ и убедитесь, что вы получите результаты. Затем добавляйте WHERE по одному, чтобы найти проблему. Что-то не так с логикой и без той же базы я не смогу получить решение. Логическую ошибку лучше исправить.
 – 
jdweng
13 Дек 2019 в 18:24

1 ответ

Компаратор равенства по умолчанию для использования метода Contains(), когда реализация IEqualityComparer<T> не предусмотрена для элемента, хранящегося в коллекции. Очевидно, что компаратор равенства по умолчанию не будет работать для элемента Anonymous class, хранящегося в selectedNotificationsMatchingIds.

У вас есть два варианта:

Вариант 1. Перепишите условие Where, чтобы использовать Any как:

//.Where(m => !selectedNotificationsMatchingIds
//           .Contains(new { m.NotificationGroup.NotificationGroupId, 
//                                            m.DeliveryType.DeliveryTypeId }))

.Where(m => !selectedNotificationsMatchingIds
        .Any(c => c.NotificationGroup.NotificationGroupId == m.NotificationGroupId
                && c.DeliveryTypeId == m.DeliveryType.DeliveryTypeId))

Вариант 2. Создайте класс со свойствами для NotificationGroupId и DeliveryTypeId и реализуйте для него интерфейс IEqualityComparer<T>. Только тогда вы можете использовать объект этого класса как часть метода .Contains().

0
MKR 23 Фев 2020 в 18:01