Расширения NHibernate Lambda не могут использовать какой-либо запрос псевдонима для DetachedCriteria

StackOverflow https://stackoverflow.com/questions/2449010

Вопрос

Я пытаюсь написать простой запрос, для которого требуется псевдоним, поскольку это ассоциация "Многие ко многим", однако я не могу заставить его работать с расширениями NH Lambda.Это всегда выдает мне ошибку компиляции, хотя, насколько я могу судить, она в точности совпадает с документацией и всеми примерами, которые я видел в Интернете.

Работает

var query = DetachedCriteria.For<County>()            
    .CreateCriteria("Zips", "zipAlias", JoinType.LeftOuterJoin)
    //.CreateCriteria<County>(x => x.Zips, 
    //                              () => zipAlias, JoinType.LeftOuterJoin)
    .Add<Zip>(zip => zip.ZipCode == zipCode);

Не работает

var query = DetachedCriteria.For<County>()            
    //.CreateCriteria("Zips", "zipAlias", JoinType.LeftOuterJoin)
    .CreateCriteria<County>(x => x.Zips, 
                                    () => zipAlias, JoinType.LeftOuterJoin)
    .Add<Zip>(zip => zip.ZipCode == zipCode);

Приводит к построению Error 22 The name 'zipAlias' does not exist in the current context

Intellisense также выделяет критерии создания**<County>** говоря, что он не понимает метод, однако он корректно показывает мне имена параметров, когда я нахожусь внутри скобок.

Это было полезно?

Решение

Тот самый Документация он полон удобных примеров.

Ваш zipAlias должна быть переменной в локальной области видимости.

Zip zipAlias = null;
string zipCode = "";

var query = DetachedCriteria.For<County>()
    .CreateCriteria<County>(x => x.Zips, () => zipAlias, JoinType.LeftOuterJoin)
    .Add<Zip>(zip => zip.ZipCode == zipCode);

Поскольку ссылка на документацию загружается вместо рендеринга, я скопировал некоторые разделы.

Создайте ассоциацию критериев с Псевдонимом
Использование оригинального ICriteria API:

ICriteria before = CreateSession()
    .CreateCriteria(typeof(Person))
        .CreateCriteria("Children", "childAlias")
            .Add(Restrictions.Eq("Nickname", "test"));

Использование расширений NHibernate Lambda:

Child childAlias = null;
ICriteria after = CreateSession()
    .CreateCriteria(typeof(Person))
        .CreateCriteria((Person p) => p.Children, () => childAlias)
            .Add<Child>(c => c.Nickname == "test");

Создайте ассоциацию Псевдонима Критерия С Псевдонимом и Типом соединения
Использование оригинального ICriteria API:

ICriteria before = CreateSession()
    .CreateCriteria(typeof(Person), "personAlias")
        .CreateCriteria("personAlias.Children", "childAlias", JoinType.LeftOuterJoin)
            .Add(Restrictions.Eq("Nickname", "test"));

Использование расширений NHibernate Lambda:

Person personAlias = null;
Child childAlias = null;
ICriteria after = CreateSession()
    .CreateCriteria(typeof(Person), () => personAlias)
        .CreateCriteria(() => personAlias.Children, () => childAlias, JoinType.LeftOuterJoin)
            .Add<Child>(c => c.Nickname == "test");

Создайте ассоциацию критериев С Псевдонимом И Типом соединения
Использование оригинального ICriteria API:

DetachedCriteria before =
    DetachedCriteria.For<Person>()
        .CreateCriteria("Children", "childAlias", JoinType.LeftOuterJoin)
            .Add(Restrictions.Eq("Nickname", "test"));

Использование расширений NHibernate Lambda:

Child childAlias = null;
DetachedCriteria after =
    DetachedCriteria.For<Person>()
        .CreateCriteria((Person p) => p.Children, () => childAlias, JoinType.LeftOuterJoin)
            .Add<Child>(c => c.Nickname == "test");
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top