【问题标题】:LINQ query fails for NULL valuesNULL 值的 LINQ 查询失败
【发布时间】:2023-03-06 08:41:01
【问题描述】:
var query = from t1 in Table1
            join t2 in Table2
                on new { t1.Id }
                equals new { t2.Id}
            select new
            {
                t1.Id,
                t1.FirstName,
                t1.MiddleName,//allows null values in the database
                t1.LastName,
                t1.phone //allows null values in the database

            };
if(query.Count()>0)//fails here"The value for column MiddleName in table'Table1' is DBNULL"
{
}

有没有一种方法可以在我的 LINQ 查询中获取所有行,包括 middleName 和 Phone 的空值?

【问题讨论】:

  • “MiddleName”和“phone”的数据类型是什么?
  • Table1Table2DataTables 对,你没有使用 Linq to SQL?
  • 为什么加入T2?你从没用过,你是不是已经过滤了这个集合?
  • 我只是想简化查询。我正在使用另一个表中的字段。是的,table1 和 table2 都是数据表。

标签: linq ado.net dataset linq-to-dataset


【解决方案1】:

问题是,一个新的匿名对象的属性在飞行中定义了从值推断的类型。

在这样的一行

MiddleName = t1.MiddleName,//allows null values in the database 

创建了一个名为middlename的新属性,其类型为t1.middlename类型。但如果t1.middlename为null,那么类型是什么? Null 没有类型。

要防止任何模糊性简单地放置

MiddleName = (string)t1.MiddleName,

让编译器知道无论如何它是一个字符串,即使没有提供。

【讨论】:

    【解决方案2】:

    你可以试一试吗

    var query = from t1 in Table1
                join t2 in Table2
                    on new { t1.Id }
                    equals new { t2.Id}
                select new
                {
                    Id = t1.Id,
                    FirstName = t1.FirstName,
                    MiddleName = t1.MiddleName,//allows null values in the database
                    LastName = t1.LastName,
                    Phone = t1.phone //allows null values in the database
    
                };
    if(query.Count()>0)//fails here"The value for column MiddleName in table'Table1' is DBNULL"
    {
    }
    

    【讨论】:

      【解决方案3】:

      如果您使用 linq-to-datasets,则必须手动将可空列转换为空,因为它们在 DataRow 中的值是 DBNull.Value。在强类型 DataSet 中,您应该能够执行以下操作:

      var query = from t1 in Table1
              join t2 in Table2
                  on new { t1.Id }
                  equals new { t2.Id}
              select new
              {
                  t1.Id,
                  t1.FirstName,
                  t1.IsMiddleNameNull ? null : t1.MiddleName,
                  t1.LastName,
                  t1.IsPhoneNull ? null : t1.Phone 
              };
      

      在无类型数据集中你会调用类似t1.IsNull("MiddleName") ? null : t1["MiddleName"]

      【讨论】:

      • 这就是我得到的......错误 11:无效的匿名类型成员声明符。必须使用成员分配、简单名称或成员访问来声明匿名类型成员。
      • 是的,这就是匿名类型的问题。它无法从 null 推断类型。
      • 如果你想使用匿名类型,你应该将条件代码包装到自定义属性中。将部分类添加到您的强类型 DataRow 并公开 MiddleNameNullable 和 PhoneNullable 等属性。
      【解决方案4】:

      听起来元数据与您的数据库架构不同步。似乎当为您的模式 MiddleName 生成类时不可为空,但现在可以了。如果是这种情况,如果您使用的是 Entity Framework,则需要刷新您的 EDMX;如果您使用的是 LINQ to SQL,则需要刷新您的类。

      【讨论】:

      • 我不认为这是问题所在。
      • 好吧,你没有提供足够的信息来帮助你,所以这是我根据你遇到的问题的猜测。 LINQ 是一种通用技术,您需要提供有关您正在使用的提供程序的更多详细信息(实体框架?LINQ2SQL?纯对象?),并且发布您的异常的完整堆栈跟踪将有更多帮助。
      • 错误:表 'Table1' 中列 'MiddleName' 的值为 DBNull。
      • 我相信 Ladislav 在这一点上的回答是正确的。你试过了吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      相关资源
      最近更新 更多