NotSupportedException 当我在 where 子句中使用方法时
本文关键字:使用方法 子句 where NotSupportedException | 更新日期: 2023-09-27 18:35:10
我正在使用nHibernate 3.2.0.4000。我使用 nHibernate.Linq 编写了此查询
var entities = (from t in this.Session.Query<Task>()
where NotIn(t, role.Tasks)
select t).ToList();
下面是方法的定义NotIn()
private bool NotIn(Task t, IEnumerable<TaskDto> tasks)
{
foreach (var task in tasks)
{
if (t.Name == task.Name) return false;
}
return true;
}
当我执行此查询时,我有一个NotSupportedException
错误:
Boolean NotIn(Probel.NDoctor.Domain.DAL.Entities.Task, System.Collections.Generic.IEnumerable`1[Probel.NDoctor.Domain.DTO.Objects.TaskDto])
我发现了一个可读性较差的非 Linq 解决方案,但我仍然想,至少,理解为什么不可能构建这样的 Linq 查询。
提前感谢您的帮助!
您必须使用表达式树将NotIn
转换为 nHibernate SQL 查询。
NHibernate LINQ 提供程序扩展是一个很好的起点。
此链接具有In
和NotIn
nHibernate的扩展方法。
你在 Linq 中的代码最终会通过 nhibernate 转换为 SQL 查询。您不能使用无法转换为 SQL 代码的方法。
NHibernate无法反编译,然后解析代码以获取有效的SQL。无法从您的方法生成 sql 语句。
改用:
var entities = (from t in this.Session.Query<Task>()
where !role.Tasks.Any(rt => rt.Name == t.Name)
select t).ToList();