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

时间:2012-05-23 14:26:37

标签: c# .net linq nhibernate linq-to-nhibernate

我正在使用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])

我发现 non Linq 解决方案的可读性较差,但我仍然希望至少理解为什么不可能像这样构建Linq查询。

提前感谢您的帮助!

4 个答案:

答案 0 :(得分:2)

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

nhibernate linq provider extension 是一个很好的起点。

this link为{nHibernate提供了InNotIn扩展方法。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

改为使用:

var entities = (from t in this.Session.Query<Task>()
                where !role.Tasks.Any(rt => rt.Name == t.Name)
                select t).ToList();