Linq to NHibernate проблема - PullRequest
       6

Linq to NHibernate проблема

0 голосов
/ 01 сентября 2010

В настоящее время у меня есть код, который создает следующее выражение LINQ (взято из демонстрационного проекта WhoCanHelpMe ).Его цель - связать вместе два выражения, но я не знаю, является ли следующее действительным выражением:

.Where(p => (p.PostCodes
      .Any(pc =>(pc = value(PatchByPostCodeSpecification).postCode)) &&
         Invoke(p => p.Teams
                    .Any(t => (Convert(t.TeamType) = 
                     Convert(value(PatchByBookingTypeSpecification).bookingType))), 
         p
       )
      ));

Когда выражение вычисляется, я получаю исключение Object reference not set to an instance of an object со следующей трассировкой стека:

в NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetEntityName (подкритерии ICriteria, строковое свойствоName) в NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetColumns (критерий подкатегории.Nriteria).CriteriaQueryTranslator.GetColumnsUsingProjection (ICriteria подкритериев, String PropertyName) на NHibernate.Criterion.CriterionUtil.GetColumnNamesUsingPropertyName (ICriteriaQuery criteriaQuery, критерии ICriteria, струнного PropertyName, значение объекта, ICriterion critertion) в NHibernate.Criterion.CriterionUtil.GetColumnNamesForSimpleExpression (String PropertyName, проекции IProjection, ICriteriaQueryкритерииQuery, критерии ICriteria, IDictionary 2 enabledFilters, ICriterion criterion, Object value) at NHibernate.Criterion.SimpleExpression.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary 2 enabledFilters) на NHibernate.Loader.Criteria.CriteriaQueryTranslator.GetWhereCondition (IDictionary 2 enabledFilters) at NHibernate.Loader.Criteria.CriteriaJoinWalker..ctor(IOuterJoinLoadable persister, CriteriaQueryTranslator translator, ISessionFactoryImplementor factory, ICriteria criteria, String rootEntityName, IDictionary 2 enabledFilters) в NHibernate.Criterion.SubqueryExpression.ToSqlString (критерии ICriteria, критерии ICriteriaQueryQuery, IDictionary 2 enabledFilters) at NHibernate.Criterion.Junction.ToSqlString(ICriteria criteria, ICriteriaQuery criteriaQuery, IDictionary 2 enabledFilters) в объекте NHibernate.Letrit.Wizard.Criteria) в NHibernate.Loader.Criteria.CriteriaLoader..ctor (IOuterJoinLoadable persister, фабрика ISessionFactoryImplementor, CriteriaImpl rootCriteria, строка rootEntityName, IDictionary 2 enabledFilters) at NHibernate.Impl.SessionImpl.List(CriteriaImpl criteria, IList results) at NHibernate.Impl.CriteriaImpl.List(IList results) at NHibernate.Impl.CriteriaImpl.List() at NHibernate.Linq.CriteriaResultReader 1.List () в NHibernate.Linq.CriteriaResultReader1016 * 1 источник) в Environment.Core.Specifications.QuerySpecification 2.SatisfyingElementsFrom(IQueryable 1 кандидат) в C: \ DEV \ Environment \ Environment \ app \ Environment.Core \ Specifications \ QuerySpecification.cs: строка 30 в Environment.Data.NHibernate.Спецификация LinqRepository 1.FindAll(ILinqSpecification 2) в C: \ DEV \ Environment \ Environment \ app \ Environment.Data \ NHibernate \ LinqRepository.cs: строка 43 ........

ОБНОВЛЕНИЕ

Я пытался гunning запрос без использования сложного выражения:

.Where(p => (p.PostCodes
      .Any(pc =>
          (pc = value(PatchByPostCodeSpecification).postCode)
          )));

По-прежнему произошла та же ошибка.

Ответы [ 2 ]

1 голос
/ 01 сентября 2010

Вы не используете linq для объектов.NHibernate.Linq является провайдером Linq.

Это означает - ему нужно знать, как перевести Ваш предикат в действительный SQL .

Теперь спроситеУ вас есть вопрос - как все базы данных, которые поддерживает nhibernate, могли когда-либо знать о преобразовании типов .net?


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

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

NHibernate.Linq может переводить в выражения SQL, такие как

orders.Any(o=>o.Customers.Any(c=>c.IsDead)).Where(o=>o.Price==10)

Но он не может перевестив выражения SQL как

orders.Where(o=>{Console.WriteLine("foo"); MsgBox("bar"); return false;})

0 голосов
/ 02 сентября 2010

Это было вызвано тем, что выражение сравнивало два объекта PostCode вместо сравнения по свойствам. Я изменил выражение так, чтобы получилось следующее:

.Where(p => (p.PostCodes
  .Any(pc =>
      (pc.Name = value(PatchByPostCodeSpecification).postCode.Name)
      )));
...