Как преобразовать это лямбда-выражение в критерии NHibernate - PullRequest
0 голосов
/ 25 октября 2011

У меня есть этот класс

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 в критерии как?

Obs: ClassRelation не является классом.

1 Ответ

0 голосов
/ 25 октября 2011

Nhibernate имеет встроенный провайдер linq в версии 3 и как дополнение в версии 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;

Или что-то более близкое к вашему запросу, которое вы на самом деле хотите.

...