如何在NHibernate Criteria中转换此Lambda表达式

时间:2011-10-25 15:43:54

标签: c# nhibernate fluent-nhibernate criteria

我有这个班级

public class MyClass
{
    public int Id { get; set;}
    public string Name { get; set; }
    public IList<MyClass> Classes { get; set; }
}

我正在使用Fluent NHibernate,我有这个AutoMappingOverride:

    public void Override(AutoMapping<MyClass> mapping)
    {
        mapping.HasManyToMany(m => m.Classes)
            .ParentKeyColumn("ClassId")
            .ChildKeyColumn("SecondClassId")
            .Table("ClassesRelation")
            .Cascade.SaveUpdate();
    }

我的存储库中有这个方法:

    public IList<MyClass> ClassesThatContains(MyClass @class)
    {
        //allClasses.Where(tempClass => tempClass.Classes.Contains(@class))
        string query = string.Format(@"SELECT Class.* FROM Class WHERE Class.Id IN (SELECT ClassesRelation.ClassId FROM ClassesRelation WHERE ClassesRelation.SecondClassId = {0})", @class.Id);

        var criteria = NhSession.CreateSQLQuery(query).AddEntity(typeof(MyClass));

        return criteria.List<MyClass>();
    }

在ClassesThatContains方法中,我有一个等同于SQL语句的注释,但是NHibernate不知道包含Linq方法....所以我使用了SQL语句,但是如何将这个SQL语句转换为Criteria呢?

Obs:ClassRelation不是Class。

1 个答案:

答案 0 :(得分:0)

Nhibernate在内置版本3中有一个linq提供程序,在版本2中有一个插件。 您可以像这样更改方法::

from c in session.Query<MyClass>()
from cr in session.Query<ClassRelation>()
where c.FirstId == cr.Id
where cr.SecondId = @class.Id
select c.Id;

或者您真正想要的更接近您的查询的内容。