Как выбрать только несколько столбцов в моем запросе NHibernate? - PullRequest
9 голосов
/ 24 мая 2011

У меня есть сопоставление одного класса с одним столом;к сожалению, в этой таблице более 110 столбцов, а запросы занимают много времени, особенно когда большую часть времени я хочу просмотреть <10 столбцов.</p>

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

Спасибо

Ответы [ 3 ]

13 голосов
/ 24 мая 2011

Легко сделать с помощью LINQ (при условии, что вы используете NHibernate 3.0 или более позднюю версию):

var products = from p in Session.Query<Product>()
               where // ...some query (snip)
               select new
               {
                   Name = p.ProductName,
                   Description = p.ShortDesc,
                   Price = p.Price,
                   Units = p.Quantity
               };

Кроме того, если вы используете HQL, вы можете просто выбрать столбцы, которые вам нужны, аналогично использованию T-SQL, но используйте Transformer для возврата строго типизированного объекта:

Сначала создайте класс с вашими суженными столбцами:

public class ProductReport
{
    public string Name { get; set; }
    public string Description { get; set; }
    public decimal Price { get; set; }
    public int Units { get; set; }
}

Затем ваш запрос:

string hql = "select p.ProductName as Name, p.ShortDesc as Description ...(snip) " +
             "from Product p " +
             "where ...some query (snip)";

IQuery query = Session.CreateQuery(hql)
    .SetResultTransformer(Transformers.AliasToBean<ProductReport>());

IList<ProductReport> products = query.List<ProductReport>();

Просто убедитесь, что псевдонимы в вашем запросе (как Имя, как Описание и т. Д.) Соответствуют именам свойств в вашем классе.

6 голосов
/ 24 мая 2011

В дополнение к примеру, который дал Тим, вы можете сделать что-то подобное:

IList selection =
    session.QueryOver<Cat>()
        .Select(
            c => c.Name,
            c => c.Age)
        .List<object[]>();

Приведенный выше пример взят из: http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx

6 голосов
/ 24 мая 2011

Используйте ProjectionList для выбора нужных столбцов. См. Здесь для примеров.

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