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