Как выбрать только несколько столбцов в моем запросе NHibernate?

#c# #nhibernate

#c# #nhibernate

Вопрос:

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

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

Спасибо

Комментарии:

1. Что вы сказали о 110 столбцах? вернемся к чертежной доске!

2. @V4Vendetta «Что? Переделать мою драгоценную базу данных? Я потратил годы на совершенствование его структуры, и никто не скажет мне, что с этим делать !!!» (c) Ваш клиент…

Ответ №1:

Это легко сделать с помощью 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>();
  

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

Комментарии:

1. Не помогает, когда у меня есть более 100 потенциальных столбцов / свойств с любой комбинацией. В любом случае спасибо.

Ответ №2:

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

 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

Ответ №3:

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

Комментарии:

1. Если ссылка исчезает, ответ вроде как бесполезен. Включите небольшой, но важный фрагмент вместе со ссылками …