2010-09-15 64 views
3

在ASP.NET MVC 2.0中我正在做类似于下面的内容(具体来说,匹配基于某些值的记录以及一些NULL值)。<column> IS NULL vs <column> =在LINQ to SQL生成SQL中的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) 

我对此有什么想法?我相信我可以打开SQL Server中的ANSI_NULLS,但这已被弃用,并且必须有一个更简单的方法。

我知道,我知道......我不应该用NULL值来定义唯一性,但有没有办法解决这个问题?

+0

你确定这是不是Linq到SQL? – 2010-09-15 00:09:12

+0

对不起 - 是的。它是。 – 2010-09-15 00:11:15

回答

3

使用object.equals,以帮助确保该查询返回的是空

http://www.brentlamborn.com/post/LINQ-to-SQL-Null-check-in-Where-Clause.aspx

变化,其中用于可空项目((variable == null && x.column == null) || (x.column == variable))

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

+0

工程就像一个魅力! - object.Equals()感觉有点笨重,但比其他任何东西都好。再次,这很少需要NULL的唯一性。非常感谢! – 2010-09-15 17:32:47