NHibernate 3.0 Linq-запрос к элементу <map>вместо использования HQL - PullRequest
2 голосов
/ 17 ноября 2010

У меня есть отображение, которое выглядит так:

  <class name="Record">
    <map name="Values">
      <key column="RecordFK"/>
      <index column="FieldFK"/>
      <element column="Value"/>
    </map>
  </class>

Перевод этого на английский: запись отображает поля в значения. В HQL я могу запросить эту карту следующим образом:

from Record rec where rec.Values[:fieldFK] = :value

Можно ли заново создать этот запрос, используя новый провайдер Linq в NHibernate 3.0 вместо HQL? Я попробовал следующий код без успеха:

   var records = session.Query<Record>()
                    .Where(rec => rec.Values[field.Key] == "foo");

Это приводило к ошибке, когда NHibernate пытался интерпретировать средство доступа к словарю:

System.NotSupportedException: System.String get_Item (System.Int32)

Есть ли способ научить NHibernate превращению этого выражения C # в SQL?

Ответы [ 2 ]

2 голосов
/ 17 ноября 2010

У NHibernate 3 есть способ расширить провайдера, чтобы разрешить больше выражений, отметьте http://fabiomaulo.blogspot.com/2010/07/nhibernate-linq-provider-extension.html

Однако это похоже на то, что должно поддерживаться. Я предлагаю вам создать билет по номеру http://jira.nhforge.org с неудачным тестовым набором.

Если вам хочется немного больше, вы можете погрузиться в https://nhibernate.svn.sourceforge.net/svnroot/nhibernate/trunk/nhibernate/src/NHibernate/Linq и создать патч. Это ускорит процесс.

Обновление (2010-12-04): Мой патч был объединен с транком. Этот сценарий теперь поддерживается (вы можете скомпилировать из исходного кода или подождать несколько дней до окончательного выпуска)

0 голосов
/ 17 ноября 2010

NHibernate также упрощает запросы с помощью CreateCriteria. Вот пример:

var records = session.CreateCriteria<Record>()
                     .Add(Restrictions.Eq("Key", "foo)
                     .List<Record>();

Но у NHibernate есть провайдер Linq, который также работает. Я не уверен, что Values[field.Key], но это, вероятно, то, что выдает ошибку. В идеале вы должны выбрать «Столбец» для сравнения с «foo».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...