#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. Если ссылка исчезает, ответ вроде как бесполезен. Включите небольшой, но важный фрагмент вместе со ссылками …