[英]C# linq-sql checking for null string
在我的数据库表中,我有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
};
}
我还发现,如果Iremove 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行具有空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
更新您的实体模型,使其一开始就不允许NULL值...在尝试执行此操作之前,您必须将当前为NULL的所有字段设置为空字符串,(可以通过SSMS进行设置)...
将所有空值设置为空字符串之后。
将此属性添加到Code
属性。
[Required(AllowEmptyStrings = true)]
public string Code { get; set; }
并迁移这些更改。
从这里开始,您只需执行Foo.Code == string.Empty
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.