Я использую обертку, чтобы получить некоторые данные из таблицы User
IQueryable<StarGuestWrapper> WhereQuery =
session.Linq<User>().Where(u => u.HomeClub.Id == clubId && u.IsActive).Select(
u =>
new StarGuestWrapper()
{
FullName = u.Name + " " + u.LastName,
LoginTime = u.SomeDateTime,
MonthsAsMember = u.SomeIntergerValue,
StarRating = u.SomeOtherInteregValue,
UserPicture = u.Photo.PhotoData,
InstructorFullName = u.SomeInstructorName,
TalkInteractionDuringSession = u.SomeBoolValue,
GoalInteractionDuringSession = u.SomeOtherBoolValue
});
Я использую это без проблем в качестве IQueryable, поэтому я могу делать полезные вещи перед тем, как фактически выполнить запрос. Нравится:
WhereQuery.Skip(startRowIndex).Take(maximumRows).ToList();
и т. Д.
Проблема возникает при использовании оператора 'where' в запросе.
Например:
WhereQuery.Where(s => s.StarRating == 1)
вызовет исключение во время выполнения, что 'StarRating' не существует в таблице User - конечно, это не , это свойство оболочки. Это сработает, если я материализую запрос по
WhereQuery.AsEnumerable().Where(s => s.StarRating == 1)
но тогда теряется смысл использования IQueryable, и я не хочу этого делать.
Что странно и интересно, что не все свойства из-за ошибки броска оболочки, все значения bool могут использоваться в операторе where. Пример:
WhereQuery.Where(s => s.TalkInteractionDuringSession)
Это работает в EntityFramework, почему я получаю эту ошибку в NHibernate и как заставить ее работать так, как я хочу?