【发布时间】:2014-02-18 04:25:54
【问题描述】:
我正在使用带有 NHibernate 的动态 LINQ。 简单的例子说明了我的问题:
var q = sess.Query<User>().Select("new (Id, Login, Person.Id as PersonId)");
当 User.Person == null 的数据库中的用户在哪里时抛出 NullReferenceException。
这样就解决了问题:
var q = sess.Query<User>().Select(new { Id, Login, PersonId = (long?)Person.Id });
但我需要类似的东西
var q = sess.Query<User>().Select("new (Id, Login, (long?)Person.Id as PersonId)");
因为选择表达式是动态生成的。 不幸的是,动态 LINQ 不理解强制转换为 (long?) :(
我应该怎么做? 提前致谢!
==== 编辑 ====
好的,我明白了两件事: 1.动态LINQ不知道long,只知道Int64。 2. Cast 不是 '(Int64)something' 而是 'Int64(something)'。 所以整个我的代码应该是
sess.Query<User>().Select("new (Id, Login, Int64?(Person.Id) as PersonId)");
但它仍然不能解决我的整个问题,因为 NHibernate 现在失败,出现无法执行查询 [SQL: SQL 不可用] 异常和 NullReference 内部异常。
【问题讨论】:
-
为什么你在动态 linq 代码中尝试
Person.Id,但在简单 linq 中你使用(long?)PersonId? -
你试试
var q = sess.Query<User>().Select("new (Id, Login, PersonId )");? -
抱歉,输入错误,正确的是 var q = sess.Query
().Select(new { Id, Login, PersonId = (long?)Person.Id }); -
您能提供
User和Person类的样本吗?Person也可以为空吗? -
示例:class User { public long Id {get;set;} public string Login {get;set;} public Person Person {get;set;} }
标签: c# linq nhibernate linq-to-nhibernate dynamic-linq