Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于空值,LINQ查询失败_Linq_Ado.net_Dataset_Linq To Dataset - Fatal编程技术网

对于空值,LINQ查询失败

对于空值,LINQ查询失败,linq,ado.net,dataset,linq-to-dataset,Linq,Ado.net,Dataset,Linq To Dataset,在我的LINQ查询中,是否有一种方法可以获取所有行,包括middleName和Phone的空值?听起来元数据与您的DB架构不同步。似乎在为您的模式生成类时,MiddleName不可为空,但现在是。在这种情况下,如果使用实体框架,则需要刷新EDMX;如果使用LINQ to SQL,则需要刷新类。如果使用LINQ to数据集,则必须手动将可为null的列转换为null,因为它们在DataRow中的值为DBNull.value。在强类型数据集中,您应该能够执行以下操作: var query = fro

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

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

如果使用LINQ to数据集,则必须手动将可为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.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"
{
}

在非类型化数据集中,您将调用类似于
t1.IsNull(“MiddleName”)的东西?空:t1[“MiddleName”]

您能试一试吗

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 
        };

问题在于,一个新的匿名对象的属性是动态定义的,其类型是从这些值推断出来的

排成这样

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的类型。但是如果t1.MiddleName为null,那么类型是什么???Null没有类型

为了避免含糊不清,简单地说

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

让编译器知道它是字符串,即使没有提供。

中间名和电话的数据类型是什么?
Table1
Table2
DataTable
没错,您没有使用Linq to SQL?为什么要加入T2?你从来没有使用过它,你已经过滤掉这个集合了吗?我只是想简化查询。我正在使用另一个表中的字段。是的,表1和表2都是数据表。我认为这不是问题所在。好吧,你没有提供足够的信息来帮助你,所以这是我根据你的问题做出的猜测。LINQ是一种通用技术,您需要提供有关您正在使用的提供程序的更多详细信息(实体框架?LINQ2SQL?纯对象?),并且发布异常的完整堆栈跟踪将帮助更多。错误:表“Table1”中列“MiddleName”的值为DBNull。我相信Ladislav的答案在这一点上是正确的。你试过了吗?这就是我得到的……错误11:无效的匿名类型成员声明符。匿名类型成员必须使用成员分配、简单名称或成员访问权限声明。是的,这就是匿名类型的问题。它无法从
null
推断类型。如果要使用匿名类型,应将条件代码包装到自定义属性。将分部类添加到强类型DataRow中,并公开MiddleNameNullable和PhoneNullable等属性。
MiddleName = (string)t1.MiddleName,