2011-05-16 51 views
0
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的空值的所有行?LINQ查询失败的NULL值

+0

“MiddleName”和“phone”的数据类型是什么? – used2could 2011-05-16 15:01:11

+0

'Table1'和'Table2'是'DataTable'正确的,你没有使用Linq to SQL? – R0MANARMY 2011-05-16 15:01:37

+0

你为什么加入T2?你永远不会使用它,你是否已经过滤了这个集合? – Nix 2011-05-16 15:03:18

回答

0

听起来像元数据与您的数据库模式不同步。看起来好像何时为您的模式生成类MiddleName不是可空的,但现在它是。如果是这样的话,如果你使用实体框架,你需要刷新你的E​​DMX,或者如果你使用的是LINQ to SQL,那么刷新你的类。

+0

我不认为这是问题所在。 – Talk2me 2011-05-16 15:20:03

+0

好的,你没有提供足够的信息来帮助你,所以这是基于你遇到的问题的猜测。 LINQ是一种通用技术,您需要提供更多关于您正在使用的提供程序(实体框架?LINQ2SQL?纯对象?)的详细信息,并且发布异常的完整堆栈跟踪会对您有所帮助。 – 2011-05-16 15:23:48

+0

我正在使用Linq-SQL – Talk2me 2011-05-16 15:46:41

1

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

+0

这就是我得到的......错误\t 11:无效的匿名类型成员声明。匿名类型成员必须声明为成员分配,简单名称或成员访问权限。 – Talk2me 2011-05-16 15:30:48

+0

是的,这是匿名类型的问题。它不能从'null'推断出类型。 – 2011-05-16 15:46:48

+0

如果您想使用匿名类型,则应将条件代码包装为自定义属性。将部分类添加到强类型DataRow中,并公开诸如MiddleNameNullable和PhoneNullable之类的属性。 – 2011-05-16 21:29:54

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" 
{ 
} 
+0

这也行不通。 – Talk2me 2011-05-16 16:11:59

0

的问题是一个新的匿名对象的属性可以根据这些值推断出来的类型定义。

在这样的线

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

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

为了防止任何ambiguousity干脆把

MiddleName = (string)t1.MiddleName, 

让编译器知道,反正这是一个字符串,即使不提供。