【问题标题】:C# linq-sql checking for null stringC# linq-sql 检查空字符串
【发布时间】: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

【问题讨论】:

标签: c# entity-framework linq tsql


【解决方案1】:

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

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

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

并迁移这些更改。

从这里开始你可以做Foo.Code == string.Empty

【讨论】:

  • 嗨,我遇到了类似的问题。我们使用的是数据库优先方法和 EF 6.1.3。我们正在尝试的查询是 employees.where(a => a.employeename == parametervalue || a.employeename == null).ToList().. 这不会返回在employeename 列中具有空值的记录.. 你能帮帮我吗..
  • @ps_prakash02 当您尝试使用 string.empty 而不是 null 进行比较检查时,它是否返回值
  • 当我与 "" 进行比较时,它会返回在employeename 列中具有空值的记录.. 但我想获取在employeename 列中具有空值的记录..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
  • 1970-01-01
  • 2014-06-21
  • 2011-04-01
  • 2017-11-25
  • 2018-11-28
  • 1970-01-01
相关资源
最近更新 更多