Почему Nhibernate.Linq выдает мне исключение «Метод Compareto не реализован»? - PullRequest
1 голос
/ 09 апреля 2011

Я долго боролся с этой проблемой и не могу заставить ее работать должным образом.Что я хочу сделать, это получить записи с датой ранее указанной записи.Чтобы вы поняли, я покажу вам этот фрагмент кода:

        var post = _session.Linq<PostModel>()
            .Where(o => o.PostId == id)
            .FirstOrDefault();

        return _session.Linq<PostModel>()
            .Where(o => DateTime.Compare(post.PostDate, o.PostDate) >= 0)
            .ToList();

Это не работает!Это выдаст мне исключение, говорящее:

The method Compareto is not implemented.

Я пытался реализовать "IComparer" для моей PostModel, но здесь, похоже, это не проблема.Хотя это будет работать, если я сначала преобразую все записи в список, а затем сравню их, например:

        return _session.Linq<PostModel>().ToList()
            .Where(o => DateTime.Compare(post.PostDate, o.PostDate) >= 0)
            .ToList()

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

У кого-нибудь есть идеи?

TIA

Ответы [ 3 ]

3 голосов
/ 09 апреля 2011

Проблема в том, что провайдеру NHibernate linq необходимо преобразовать вызов в DateTime.Compare в SQL, чтобы его можно было выполнить на сервере.Как говорится в сообщении об ошибке, это не было реализовано, хотя вы можете изменить свой запрос на:

_session.Linq<PostModel>()
            .Where(o => post.PostDate >= o.PostDate)
            .ToList();

, что, вероятно, будет выполнено.

2 голосов
/ 09 апреля 2011

У Ли есть удар. Поставщик NHibernate LINQ не имеет возможности преобразовать вызов метода в SQL, поэтому создается исключение NotImplementedException. Вы можете предоставить NHibernate способ перевода этого вызова в SQL с помощью модели расширения поставщика LINQ NHibernate:

http://fabiomaulo.blogspot.com/2010/07/nhibernate-linq-provider-extension.html

2 голосов
/ 09 апреля 2011

Просто предположение, но вам может не понравиться статический вызов по вашей причине.Возможно, просто попробуйте использовать встроенные реляционные операторы для datetime, например так:

.Where(o => o.PostDate >= post.PostDate)

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

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