2010-07-29 5 views
3

Я добавил некоторые расчетные свойства только для чтения в мой класс и теперь бросает QueryException: не удалось разрешить свойство.Добавление вычисляемых свойств в класс throws Ошибка NHibernate при использовании Linq to NHibernate

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

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

Mapping:

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

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

<property name="DbaName" access="readonly" insert="false" update="false" type="String" formula="(SELECT 'Dba')" /> 
+0

Это похоже на плохой способ обращения с этим. Почему я хочу, чтобы мой запрос обрабатывал это? Похоже, что лучшим действием было бы сказать NHibernate, что поле не отображается. Не уверен, что здесь находится NHibernate или Linq. –

+0

@Mike: Насколько я знаю, это единственный способ чистить это с помощью существующего поставщика NH Linq (как это ни прискорбно). Хотя это и не совсем желательно, это позволит вам запрашивать эти рассчитанные поля в HQL/etc в дополнение к решению проблемы с провайдером linq ... – DanP

+0

Yikes. Надеюсь, кто-то еще зазвонит. –

1

NHibernate генерирует SQL заявление для выполнения на сервере. Вычисляемые поля не существуют в db, поэтому вы не можете использовать их в запросе 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); 
Смежные вопросы