<column> IS NULL против <column>= NULL в LINQ to SQL сгенерированный SQL - PullRequest
3 голосов
/ 15 сентября 2010

в ASP.NET MVC 2.0 Я делаю что-то вроде ниже (в частности, сопоставление записи на основе некоторых значений, а также некоторых значений NULL).

var result = dataContext.Inventory
 .SingleOrDefault(x => (x.part_id == model.Part.id &&
                        x.location_id == transaction.to_location_id &&
                        x.bin_id == transaction.to_bin_id &&
                        x.project_id == transaction.project_id &&
                        x.expiration_date == inventoryToTransfer.expiration_date));

... который возвращает null. Я знаю, что запись существует, но сгенерированный SQL (если я включаю ведение журнала SQL) -

SELECT [t0].[id], [t0].[part_id], etc...
FROM [dbo].[Inventory] AS [t0]
INNER JOIN [dbo].[Parts] AS [t1] ON [t1].[id] = [t0].[part_id]
WHERE ([t0].[part_id] = @p0) AND (([t0].[location_id]) = @p1) AND ([t0].[bin_id] = @p2) AND
([t0].[project_id] = @p3) AND ([t0].[expiration_date] = @p4)
-- @p0: Input BigInt (Size = 0; Prec = 0; Scale = 0) [5197]
-- @p1: Input BigInt (Size = 0; Prec = 0; Scale = 0) [57]
-- @p2: Input BigInt (Size = 0; Prec = 0; Scale = 0) [71]
-- @p3: Input BigInt (Size = 0; Prec = 0; Scale = 0) [Null]
-- @p4: Input DateTime (Size = 0; Prec = 0; Scale = 0) [Null]

Что на самом деле ничего не даст, так как сравнение = NULL не вернет совпадений. Я думал о том, что это сгенерирует IS NULL (что прекрасно работает). Вот так ...

...
([t0].[project_id] IS NULL) AND ([t0].[expiration_date] IS NULL)

Чего мне не хватает с этим? Я считаю, что я мог бы включить ANSI_NULLS в SQL Server, но это устарело, и должен быть более простой способ.

Я знаю, я знаю ... Я не должен определять уникальность с помощью значений NULL, но есть ли способ обойти это?

1 Ответ

3 голосов
/ 15 сентября 2010

Используйте object.equals, чтобы гарантировать, что возвращаемый запрос является нулевым1010 *

http://blog.linqexchange.com/index.php/how-to-use-is-null-with-linq-to-sql/

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