Linq to NHibernate проблема с использованием оператора where - PullRequest
5 голосов
/ 12 апреля 2010

Я использую обертку, чтобы получить некоторые данные из таблицы 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 и как заставить ее работать так, как я хочу?

1 Ответ

2 голосов
/ 26 апреля 2010

Имейте в виду, что старый поставщик nHibernate Linq является лишь частичной реализацией, и над ним больше не ведется активная работа. Сейчас разрабатывается новый и более полный поставщик linq, который станет частью NH3.0 (вы можете проверить транк и собрать его, чтобы увидеть, решает ли он эту проблему).

Моя рекомендация состоит в том, чтобы изменить код для вызова ToList () в тот момент, когда вы явно хотите использовать базу данных. Вы передаете запрос из будущего хранилища обратно из своего хранилища, после чего с запросом может произойти что-либо технически. Даже EF и LINQ2SQL не могут перевести любой возможный запрос linq в SQL.

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

...