对于NULL值,LINQ查询失败

时间:2011-05-16 14:58:08

标签: linq ado.net dataset linq-to-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.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的空值?

4 个答案:

答案 0 :(得分:1)

如果您使用的是linq-to-datasets,则必须手动将可空列转换为null,因为它们在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 
        };

在非类型化的DataSet中,您将调用类似t1.IsNull("MiddleName") ? null : t1["MiddleName"]

的内容

答案 1 :(得分:0)

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

答案 2 :(得分:0)

请你试一试

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 :(得分:0)

问题在于新的匿名对象具有动态定义的属性,从值中推断出类型。

在这样的一行

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

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

为防止出现任何歧义,请简单地提出

MiddleName = (string)t1.MiddleName,

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