Расширения NHibernate Lambda не могут использовать какой-либо запрос псевдонима для DetachedCriteria
-
20-09-2019 - |
Вопрос
Я пытаюсь написать простой запрос, для которого требуется псевдоним, поскольку это ассоциация "Многие ко многим", однако я не могу заставить его работать с расширениями 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");