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的空值?
答案 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,
让编译器知道,无论如何它都是一个字符串,即使没有提供。