Nhibernate / Linq: NHibernate.QueryException: не удалось разрешить свойство: Profile.class of: MyNamespace.MyObject - PullRequest
2 голосов
/ 10 августа 2010

У меня проблема с моим запросом linq.Я пытаюсь фильтровать объекты на основе выбранных значений.Мы используем модель запроса, которая возвращает выражение System.Linq.Expressions.Expression и использует его для создания запроса nhibernate.Вот мое выражение linq.

x =>(request.InitialLoad
     || (!request.InitialLoad
         && (Enum.GetValues(typeof(MyType)).Length == request.MyTypes.Length
             ||
             (Enum.GetValues(typeof(MyType)).Length != request.MyTypes.Length
              &&
              ((request.MyTypes.Contains((int)MyType.Referrals)
                && x.Post.PostType == StatusPostType.Referral)
               ||
               (request.MyTypes.Contains((int)MyType.Businesses)
                && x.Post.Profile is BusinessProfile)
               ||
               (request.MyTypes.Contains((int)MyType.Members) 
                && x.Post.Profile is UserProfile)
              )
             )
            )
        )
    )
    && x.Profile.Equals(request.Profile);

Отображения (мы используем свободное владение) выглядят так:

MyObject (свойство Post):

References(x => x.Post, "PostId");

MyObject.Post (свойство профиля):

References(x => x.Profile, "ProfileId");

Когда я изменяю x.Post.Profile is SomeType на x.Post.Profile.GetType() == typeof(SomeType), выдается другая ошибка, которая

System.ArgumentOutOfRangeException: для индекса не былоспектр.Должен быть неотрицательным и меньшим, чем размер коллекции.Имя параметра: index

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

Свойстваникак не модифицируется моделью.Это виртуальные свойства со значением по умолчанию get / set.

Есть идеи?

1 Ответ

3 голосов
/ 12 августа 2010

Я почти уверен, что NHibernate.Linq не поддерживает фильтрацию по типу класса напрямую. Если вам необходимо различать типы, я бы использовал значение свойства базового класса (возможно, enum), для которого в дочерних классах установлено правильное значение. Затем вы можете выполнить сравнение следующим образом:

x.Post.Profile.Type = ProfileTypes.BusinessProfile

Просто установите это свойство статически в конструкторе для дочерних классов, сопоставьте его с NHibernate и установите update=false для сопоставления свойств. Хотя это и несколько не элегантно, это должно дать вам результаты, которые вы ищете.

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