Рекомендуемый способ оптимизации Linq2NHibernate - PullRequest
1 голос
/ 06 мая 2011

Я использую Linq2NHibernate для выборки данных из таблицы в нескольких запросах.Хотя таблица содержит 10 столбцов, я использую только 3 из них в своем запросе, и впоследствии мне не нужны другие свойства.Тем не менее, сгенерированный SQL загружает (как и ожидалось) все свойства для каждого запроса.

Каков рекомендуемый способ оптимизации запроса?

Имеет ли смысл сделать объект более легкимварианты, которые будут использоваться для оптимизированных запросов?Т.е. создать сущность, содержащую только 2 свойства, и сопоставить ее с той же таблицей?Если фактическая сущность наследуется от более легкой сущности, она не должна создавать слишком много беспорядка, и NHibernate в конечном итоге получит только меньшее подмножество данных.

Это обычная практика или есть лучший способоптимизировать запросы?Я бы предпочел придерживаться LINQ, так как он сейчас используется в проекте.

[Редактировать]

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

Другими словами, этот запрос будет загружать все свойства:

/* fetch actual entities */
var results = session
     .Query<Food>()
     .Where(p => p.Proteins < 100 && p.Fats < 50);

/* ... results in: */
SELECT Id, Proteins, Fats, Carbs, Name, Whatever
FROM [Food] WHERE Proteins < 100 AND Fats < 50

В то время как этот запрос будет генерировать запрос только дляпрогнозируемые свойства:

/* fetch light DTOs */
var results = session
     .Query<Food>()
     .Where(p => p.Proteins < 100 && p.Fats < 50)
     .Select(p => new 
     {
        Proteins = p.Proteins,
        Fats = p.Fats        
     });

/* generated sql: */
SELECT Proteins, Fats
FROM [Food] WHERE Proteins < 100 AND Fats < 50

1 Ответ

1 голос
/ 06 мая 2011

Поскольку вы еще не опубликовали свой фактический запрос, трудно понять, в чем проблема. Как правило, вы должны заполнить объект передачи данных (DTO) только теми полями, которые вам необходимы. Это исправит одну проблему. Что касается вашего запроса LINQ, включая каждое поле в вашем доменном объекте, вы должны использовать проекции. Прогнозы скажут NHibernate только о тех, кто не входит в ваш домен. Обратите внимание, что я не запрашиваю NHibernate с помощью LINQ, но концепции совпадают.

Кроме того, я согласен с Matías Fidemraizer, что вам следует рассмотреть возможность использования нового API QueryOver.

...