null в запросе Linq - PullRequest
       3

null в запросе Linq

0 голосов
/ 11 августа 2011

Я использую Linq to EF и пытаюсь получить разрешение FirstOrDefault от ObjectSet. Запрос выглядит так:

        Notification not = new Notification();
        ........
        //not.SubTypeID = null;

        var elem = ent.Notifications.FirstOrDefault(p =>                     
                    p.ID == not.ID &&
                    p.SubTypeID == not.SubTypeID &&
                    p.Location == not.Location &&
                    p.TypeID == ns.TypeID
            );

Иногда SubTypeID может быть null, и в этом случае ничего не возвращается в elem althogh p.SubTypeID и not.SubTypeID оба null.

Но странно то, что когда я запускаю этот запрос:

        var elem = ent.Notifications.FirstOrDefault(p =>                     
                    p.ID == not.ID &&
                    p.SubTypeID == null &&
                    p.Location == not.Location &&
                    p.TypeID == ns.TypeID
            );

все работает как положено, и я вижу данные в elem.

Итак, что я делаю не так и в чем разница между этими двумя запросами, когда not.SubTypeID равен null.

1 Ответ

1 голос
/ 11 августа 2011

В C # результат null == null равен true. Но в SQL, в который компилируется это дерево выражений, результат NULL = NULL равен NULL. Пример на PostgreSQL:

SELECT 1 WHERE NULL = NULL;
 ?column?
----------
(0 rows)

Возможно, вы захотите использовать выражение вроде:

p.SubTypeID == not.SubTypeID ||
(p.SubTypeID == null && not.SubTypeID == null)

Это своего рода хак, и может быть лучшее решение, чем это. Но тест NULL = NULL, вероятно, является причиной вашей проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...