Добавление вычисляемых свойств к классу вызывает ошибку NHibernate при использовании Linq для NHibernate - PullRequest
3 голосов
/ 29 июля 2010

Я добавил некоторые вычисленные свойства только для чтения в свой класс, и теперь он генерирует исключение QueryException: не удалось разрешить свойство.

Вот мой класс (поддельные вычисления прямо сейчас):

public class IncompleteApplication : DealerBase
    {
        public virtual string Content { get; set; }
        public virtual string LegalBusinessName
        {
            get
            {
                return "Leg";
            }
        }
        public virtual string DbaName
        {
            get
            {
                return "Dba";
            }
        }
    }

Отображение:

public class IncompleteApplicationMap : DealerBaseMap<IncompleteApplication>
    {
        public IncompleteApplicationMap()
        {
            Schema("Dealer");
            Table("XmlSerialization");

            Map(app => app.Content);
        }
    }

И вызывающий код:

data.GridDataItems = (from app in _Repository.GetAll()
                                  select new GridData.GridDataItem()
                                  {
                                      ID = app.Id,
                                      SubmittedDate = app.LastUpdated,
                                      UserName = app.User.UserName,
                                      LegalBusinessName = app.LegalBusinessName,
                                      DbaName = app.DbaName
                                  }).ToArray();

_Repository.GetAll () возвращает IQueryable.Когда я добавляю .ToList () после GetAll (), код работает нормально (хотя я получаю ситуацию Select N + 1).

Спасибо за любую помощь!

Ответы [ 2 ]

2 голосов
/ 30 июля 2010

Вам следует сопоставить два свойства, доступные только для чтения, с помощью nhibernate и использовать формулу для предоставления их значений при запросах. Я не очень хорошо знаю nh, но стандартное сопоставление xml для ваших свойств будет выглядеть примерно так:

<property name="DbaName" access="readonly" insert="false" update="false" type="String" formula="(SELECT 'Dba')" />
1 голос
/ 08 августа 2010

nHibernate генерирует SQL-оператор для выполнения на сервере.Вычисленные поля не существуют в БД, поэтому их нельзя использовать в запросе nHibernate.

Что вы можете сделать, это выполнить запрос, соответствующий всем вашим критериям, кроме полей вычисления, затем после .ToArray () с использованием linq для этого объекта.

data.GridDataItems = (from app in _Repository.GetAll()
                                  select new GridData.GridDataItem()
                                  {
                                      ID = app.Id,
                                      SubmittedDate = app.LastUpdated,
                                      UserName = app.User.UserName,
                                  }).ToArray().Where(i=> i.LegalBusinessName = app.LegalBusinessName && i.DbaName = app.DbaName);
...