0

我正在使用 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 查询。

预先感谢您的帮助!

4

4 回答 4

2

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

nhibernate linq 提供程序扩展是一个很好的起点。

此链接具有nHibernateInNotIn扩展方法。

于 2012-05-23T14:41:22.673 回答
1

您在 Linq 中的代码最终会被 nhibernate 转换为 SQL 查询。您不能使用无法转换为 SQL 代码的方法。

于 2012-05-23T14:31:29.153 回答
0

NHibernate 无法反编译然后解析您的代码以获得有效的 SQL。无法从您的方法生成 sql 语句。

于 2012-05-23T14:32:00.650 回答
0

而是使用:

var entities = (from t in this.Session.Query<Task>()
                where !role.Tasks.Any(rt => rt.Name == t.Name)
                select t).ToList();
于 2012-05-23T14:36:17.640 回答