【问题标题】:SELECT NEW with a potentially null field using LINQ and Entity Framework使用 LINQ 和实体框架选择具有可能为空字段的新选项
【发布时间】:2011-02-08 15:06:45
【问题描述】:

我想快速选择一些行,将其格式化为下拉列表/选择列表或类似的东西 - 但我在数据库中有一个字段,可以为空 (DateOfBirth)。

var athletes = (from at in _db.Athletes
           select new{
                  Name = at.Name + " " + at.DateOfBirth, 
                  Id = at.AthleteId 
                  }).ToList();

在这种情况下,有没有办法在 LINQ 中处理可为空的类型?

编辑:

我没有注意这个事实,因为这是使用实体框架,所以不能使用标准 LINQ 的方法,除非它们有 SQL 翻译。

  • DateOfBirth 是一个 Nullable
  • 来源是 Entity Framework 4

【问题讨论】:

  • ... " + (at.DateOfBirth as string ?? string.empty),
  • 是 linq to SQL、Entity Framework 还是普通的 LINQ?

标签: c# linq


【解决方案1】:

您可以使用空合并运算符,请参阅Equivalent of SQL ISNULL in LINQ?

类似:

var athletes = (from at in _db.Athletes
           select new{
                  Name = at.Name + " " + (at.DateOfBirth ?? ""), 
                  Id = at.AthleteId 
                  }).ToList();

【讨论】:

    【解决方案2】:

    通常可以使用variable ?? default 处理可空值

    var res = nullableVariable ?? defaultValue;
    

    但要小心 datetime,linq 会尝试在 SQL 中实现这一点,而 C# 中的 DateTime.MinValue 不在 SQL 的有效范围内,并且会给你一个错误消息。

    【讨论】:

    • SQL Server datetime 和 smalldatetime 类型是这样,但是 SQL Server 2008 datetime2 和 date 类型与 C# DateTime 类型具有相同的精度支持,因此不会出现这种类型超出范围的错误使用这些类型。
    • 是的,但是很多数据库都使用 DateTime 字段,并且更改数据库很少是一种选择,在这种情况下很可能不值得;)
    • 是的,这些类型绝对适合用于新开发。仅仅为了它而重构数据库模型和存储过程等以在 SQL Server 中使用这些数据类型的开发工作是一种浪费的活动。无论如何,我们不知道使用的是什么日期数据类型,提问者从未指出......所以这是一个非常切线相关的讨论
    【解决方案3】:

    既然你只是在做字符串追加试试这个。

    var athletes = (from at in _db.Athletes
               select new{
                      Name = at.Name + " " + (at.DateOfBirth ?? string.Empty), 
                      Id = at.AthleteId 
                      }).ToList();
    

    【讨论】:

      【解决方案4】:

      在 VB.NET 中

      Dim athletes = (From at In _db.Athletes
             Select New With{
                    .Name = at.Name + " " + If(at.Field(Of Object)("DateOfBirth") = Nothing, string.Empty, at.Field(Of Object)("DateOfBirth")), 
                    .Id = at.AthleteId 
                    }).ToList()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多