在我的数据库表中,我有54行,其中53行在Code列中为NULL,定义为varchar(100)。 (我通过使用Microsoft SQL Management Studio直接在数据库上执行查询来确认这些字段为空)我尝试使用以下LINQ代码返回字段为null的所有行:
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行具有空代码列,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
答案 0 :(得分:1)
更新您的实体模型,首先不允许NULL值...您必须在尝试之前将所有当前为NULL的字段设置为空字符串(您可以通过SSMS设置它们)。 。
将所有空值设置为空字符串后
将此属性添加到Code
属性。
[Required(AllowEmptyStrings = true)]
public string Code { get; set; }
并将这些更改迁移过来。
从这里开始,您可以Foo.Code == string.Empty