NHibernate.LINQ Поддерживаемые операторы

Я пытаюсь оценить NHibernate.LINQ 1.0 без написания кода. Айенде признал, чтоэта версия поддержки LINQ ниже по сравнению с EFНо, судя по всему, я не могу найти страницу, которая объясняет, что поддерживается и не поддерживается в этой реализации. Например, могу ли я использоватьSkip & Take? Что я не могу использовать?

Ответы на вопрос(3)

Решение Вопроса

LINQ для NHibernate примеры, чтобы увидеть тесты, проведенные самим Айенде, о том, что реализовано, а что нет для этого провайдера.

Некоторые из техв общем-то поддерживается:

Создание анонимного типа.new { Person = x.Name }Первый().query.First()Во-первых, OrDefault ().query.FirstOrDefault()Не замужем().query.Single()SingleOrDefault ().query.SingleOrDefault()Совокупные ().query.Aggregate((x1,x2) => x1)Contains(). <code>query.Where(x => x.Name.Contains("Foo"))</code>StartsWith().EndsWith().Substring(). <code>where db.Methods.Substring(e.FirstName, 1, 2) == "An"</code>Sub-queries. <code>query.Where(x => x.Company.Id == 4)</code>Count(). <code>query.Where(x => x.Relatives.Count > 0)</code>Any(). <code>query.Any()</code>Take(). <code>query.Take(10)</code>Skip(). <code>query.Take(10).Skip(4)</code>OrderBy(). <code>orderby x.Name descending</code>Replace(). <code>AfterMethod = e.FirstName.Replace("An", "Zan"),</code>CharIndex(). <code>where db.Methods.CharIndex(e.FirstName, 'A') == 1</code>IndexOf(). <code>where e.FirstName.IndexOf("An") == 1</code><p>Problematic:</p>Group byJoins

One of my own examples:

query = NSession.Session.Linq<Catalog>()
            .Where(acc => acc.Company.Status == "A")
        .Where(acc => acc.Id.StartsWith("12-536"))
        .Where(acc => acc.Id.EndsWith("92") || acc.Id.EndsWith("67"))
        .Take(10).OrderBy(acc => acc.Title);

Если ваше производственное приложение использует последнюю стабильную сборку 2.1.2.4, как и я, вы застряли на том, что дает нам провайдер NHibernate.Linq, пока NHibernate 3.0 (trunk) не получит стабильный выпуск, и мы не почувствуем себя достаточно безопасными для его использования. на основных приложениях. До тех пор я более чем доволен смесью NHibernate.Linq и HQL.

 Paco23 сент. 2010 г., 23:56
Хороший ответ + голосуй! Обратите внимание, что магистраль NHibernate стабильна для всех функций, реализованных в предыдущем выпуске. Проблемы - некоторые старые проблемы и проблемы в новых функциях. Поставщик linq в транке более стабилен, чем другой. Многие используют транк в уже запущенных основных приложениях.
 rebelliard26 нояб. 2010 г., 13:11
@Paco: Переехал в сундук NH, и все хорошо. :)
 Jon Adams07 янв. 2011 г., 23:49
Отличный список. Хотя примечание, по состоянию на NH3.0.0GA комбинация OrderBy () / OrderByDescending () в столбце Count () 'не удалась. Увидеть216.121.112.228/browse/NH-2203
 Bytemaster23 сент. 2010 г., 23:58
Стабильная версия, кажется, поддерживает все агрегаты. Например, я использую MAX, и он полностью преобразуется в базу данных и выполняется там. Обратите внимание, что есть небольшая ошибка со сравнением строк, если вы используете VB.NET. Я нашел это трудным путем. Просто используйте myStr.Equals ("foo"), а не mystr = "foo", и все работает отлично. Не проблема при использовании C #.
 rebelliard24 сент. 2010 г., 19:20
@ Пако: приятно знать. Я попробую переместить одно из моих приложений в NH trunk и посмотреть, как оно работает (в тестовой среде, конечно).

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

Linq2NH 1.0, IIRC, также дросселирует при использовании членов класса, которые не отображаются, поэтому, если, например, у вас есть вычисляемое свойство только для чтения, такое как специальное взвешенное или скользящее среднее, вы должны отобразить его в столбец DB, чтобы ссылаться на него в лямбде (или воссоздать логику в лямбде). Это связано с тем, что дерево выражений в конечном итоге сводится к SQL (через одного из промежуточных звеньев NH; в 2.x это ICriteria, в 3.x - HQL), и если NH не может взять выражение и преобразовать его 1: 1 в SQL Выражение, которое оценит успешно, просто не сработает.

Есть один особый случай: Linq2NH, IIRC, достаточно умен, чтобы превратить выражение IList.Contains () в предложение IN. Список должен быть определен в лямбде (например,new[]{"1","2"}.Contains(m.ID)).

 Kevin McKelvin24 сент. 2010 г., 10:22
Очень хороший ответ, только одно исправление - то, как вы сформулировали это в 3.x, что оно идет через HQL, звучит так, как будто вы говорите, что запрос LINQ сначала превращается в строку HQL. Что происходит, так это то, что дерево выражений анализируется обратно в те же AST, на которые нацеливается синтаксический анализатор HQL ANTLR. Это гораздо эффективнее, чем нацеливание на строку;)blogs.imeta.co.uk/sstrong/archive/2009/02/22/617.aspx

rante. Linq 1.0. Поставщик linq устарел около года из-за нового поставщика linq в магистрали NHibernate. Новый поставщик linq еще не полностью завершен, но уже очень полон и может использоваться гораздо больше, чем старый поставщик linq. Вещи, которые не работают с новым провайдером linq, считаются ошибками и будут решены однажды, когда будут сообщены.

Вы можете использовать skip and take со старым и новым поставщиком linq. Текущий список известных проблем можно найти наNHibernate Jira, Другие проблемы неизвестны, и все другие функции уже поддерживаются.

Ваш ответ на вопрос