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 查询。

提前感谢您的帮助!

NotSupportedException 当我在 where 子句中使用方法时

您必须使用表达式树将NotIn转换为 nHibernate SQL 查询。

NHibernate LINQ 提供程序扩展是一个很好的起点。

此链接具有InNotIn 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();