C#linq-sql检查空字符串

时间:2016-02-11 17:21:14

标签: c# entity-framework linq tsql

在我的数据库表中,我有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

1 个答案:

答案 0 :(得分:1)

更新您的实体模型,首先不允许NULL值...您必须在尝试之前将所有当前为NULL的字段设置为空字符串(您可以通过SSMS设置它们)。 。

将所有空值设置为空字符串后 将此属性添加到Code属性。

[Required(AllowEmptyStrings = true)]
public string Code { get; set; }

并将这些更改迁移过来。

从这里开始,您可以Foo.Code == string.Empty