【发布时间】:2016-02-11 17:21:14
【问题描述】:
在我的数据库表中,我有 54 行,其中 53 行在定义为 varchar(100) 的 Code 列中为 NULL。 (我通过使用我的 Microsoft SQL Management Studio 直接在数据库上执行查询来确认这些字段为空)我尝试使用以下 LINQ 代码返回字段为空的所有行:
public IQueryable<LocationHeader> LocationHeaders
{
return from p in Context.LocationTypes
where p.Code == null
select new LocationHeader
{
ID = p.ID,
Description = p.Description,
Code = p.Code
};
}
我还发现,如果删除 where 子句,然后在我的 LocationHeaders 属性上调用 ToList() 并对其进行查询,它只会返回我期望的 53 行。
var test = LocationHeaders.ToList().Where(x => x.Code == null);
我还尝试了 p.Code.Equals(null) 和 object.Equals(p.Code, null),正如本网站和其他地方的相关问题中所建议的那样。它总是返回一个空集合。如果我将其更改为 p.Code != null 它会返回所有 54 行(其中 53 行有一个 null Code 列,而 1 没有)但我查看这些对象 Code 属性已设置为 null。
我还尝试将我的代码属性合并为一个空字符串,以便稍后检查:
Code = p.Code ?? string.Empty
但这完全没有改变,当我在执行查询后查看项目时,我的对象的 Code 属性仍然设置为 null。
有谁知道为什么会这样以及我可以做些什么来解决它?如果这很重要,我正在使用 EF 6 Code-First。
编辑:我已将代码永久更改为以这种方式阅读:
public IQueryable<LocationHeader> LocationHeaders
{
return from p in Context.LocationTypes
where object.Equals(p.Code, null)
select new LocationHeader
{
ID = p.ID,
Description = p.Description,
Code = p.Code
};
}
我终于想到使用 SQL Server 探查器检查查询。它仍然像这样编写查询:
exec sp_executesql N'SELECT
[Extent1].[ID] AS [ID],
[Extent1].[Description] AS [Description],
[Extent1].[Code] AS [Code]
FROM [dbo].[LocationType] AS [Extent1]
WHERE [Extent1].[Code] = @p__linq__0',N'@p__linq__0 nvarchar(4000)',@p__linq__0=NULL
【问题讨论】:
-
DGibbs,正如我在问题中所说,我尝试使用 object.Equals 方法,但它没有解决我的问题,所以这不能重复。
-
Steve Greene,那里提出的解决方案建议在传递的变量等于 null 时直接检查 null,这就是我正在做的事情,因为我没有变量并且只有,总是检查 null。
-
你试过 string.IsNullorEmpty() 吗?我感觉你的 p.Code 不是 null 而是空的
标签: c# entity-framework linq tsql