Условие NHibernate QueryOver для нескольких свойств - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть таблица armor, в которой есть три поля для идентификации отдельных дизайнов: make, model и version.

Мне нужно реализовать функцию поиска для нашего программного обеспечения, которая позволяет пользователю искать броню в соответствии с различными критериями, среди которых их дизайн.

Теперь, идея пользователя о дизайне - это одна строка, содержащая объединенные make, model и version, поэтому запись - это одна строка. Допустим, они хотят посмотреть спецификации для марки FH, модели TT, версии 27, они подумают (и наберут) «FHTT27».

Мы используем IQueryOver объект, к которому мы добавляем последовательные условия в соответствии с критериями. Для дизайна наш код

z_quoQuery = z_quoQuery.And(armor => armor.make + armor.model + armor.version == z_strDesign);

Возникает InvalidOperationException, «переменная« броня »типа« IArmor », на которую ссылаются из области», но она не определена ».

Здесь это описывается как ошибка: https://github.com/mbdavid/LiteDB/issues/637

После долгих проб и ошибок кажется, что синтаксисы, которые не используют переменную armor, сначала вызывают это исключение.

Очевидно, я должен идти другим путем, по крайней мере сейчас, но после поиска в течение некоторого времени, я не могу найти, как. Я думал об использовании что-то вроде

z_quoQuery = z_quoQuery.And(armor => armor.make == z_strDesign.SubString(0, 2).
                        And(armor => armor.model == z_strDesign.SubString(2, 2).
                        And(armor => armor.version == z_strDesign.SubString(4, 2);

К сожалению, поля могут иметь переменную длину. Например, другой набор значений для make, model и version может быть, соответственно, "NGI", "928" и "RX", что приведенный выше код будет анализироваться неправильно. Так что я не могу обойти трудности таким образом. Также я не могу использовать RegEx.

Также я не могу создать свойство в своем классе Armor, которое объединит все три свойства, поскольку оно не может быть преобразовано в SQL с помощью NHibernate.

У кого-нибудь есть идеи, как это сделать?

Может быть, мне следует использовать явное условие SQL здесь, но как бы оно сочеталось с другими условиями?

1 Ответ

0 голосов
/ 14 сентября 2018

Кажется, вы можете использовать Projections.Concat для решения вашей проблемы:

z_quoQuery = z_quoQuery.And(armor => Projections.Concat(armor.make, armor.model, armor.version) == z_strDesign);
...