代码之家  ›  专栏  ›  技术社区  ›  Andrew Flanagan

在LINQ to SQL生成的SQL中,<column>为NULL vs<column>=NULL

  •  3
  • Andrew Flanagan  · 技术社区  · 14 年前

    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将不返回任何匹配项。我在想的是,这将生成一个空值(这非常有效)。这样地。。。

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

    我知道,我知道。。。我不应该用空值来定义唯一性,但是有办法解决这个问题吗?

    1 回复  |  直到 14 年前
        1
  •  3
  •   Kevin LaBranche    14 年前

    使用 object.equals 以帮助确保查询返回为null

    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/