对于空值,LINQ查询失败
在我的LINQ查询中,是否有一种方法可以获取所有行,包括middleName和Phone的空值?听起来元数据与您的DB架构不同步。似乎在为您的模式生成类时,MiddleName不可为空,但现在是。在这种情况下,如果使用实体框架,则需要刷新EDMX;如果使用LINQ to SQL,则需要刷新类。如果使用LINQ to数据集,则必须手动将可为null的列转换为null,因为它们在对于空值,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
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,