对于 NULL 值,LINQ 查询失败


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 查询中获取所有行,包括中间名和电话的空值?

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

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"]

听起来元数据与您的数据库架构不同步。似乎在为您的架构生成类时,中间名不可为空,但现在是。如果是这种情况,则需要刷新 EDMX(如果使用实体框架)或刷新类(如果使用 LINQ to SQL)。

你能试一试吗

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"
{
}

问题是一个新的匿名对象使用从值推断的类型动态定义其属性。

在这样的行中

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

将创建一个名为中间名的新属性,其类型为 t1。中间名的类型。但如果t1。中间名为空,是什么类型???空没有类型。

为了防止任何歧义,只需将

MiddleName = (string)t1.MiddleName,

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

相关内容

  • 没有找到相关文章

最新更新