繁体   English   中英

C#Linq-SQL检查空字符串

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM