Могу ли я эффективно запрашивать общие поля, не прибегая к HQL?
Я выполняю множество запросов, чтобы получить только первые пару элементов большого набора, например, чтобы показать три самые последние новостные статьи или сообщения в блоге на главной странице веб-сайта.
Пока этот запрос включает только предопределенные или пользовательские части, я могу сделать что-то вроде этого:
public IEnumerable<ContentItem> GetTopArticles(int amount)
{
var cultureRecord = _cultureManager.GetCultureByName(_orchardServices.WorkContext.CurrentCulture);
var articles = _orchardServices.ContentManager.Query().ForType("Article")
.Where<LocalizationPartRecord>(lpr => lpr.CultureId == cultureRecord.Id)
.OrderBy<CommonPartRecord>(cpr => cpr.PublishedUtc)
.Slice(0, amount);
return articles;
}
Я предполагаю, что это будет более или менее таким же, как SELECT TOP [amount] ...
в SQL и будет иметь хорошую производительность на большом количестве записей.
Однако иногда я использую Миграции или Импорт для создания типов контента из внешнего источника и хочу условно проверить поле из общей части. В этом случае у меня нет класса Part или PartRecord, который я мог бы передать в качестве параметра методам ContentQuery, и если я хочу сделать условную проверку любого из полей, я сейчас делаю что-то вроде этого:
public IEnumerable<ContentItem> GetTopArticles(int amount)
{
var articles = _orchardServices.ContentManager.Query().ForType("Article")
.OrderBy<CommonPartRecord>(cpr => cpr.PublishedUtc)
.List()
.Where(a => a.Content.Article.IsFeatured.Value == true)
.Take(amount);
return articles;
}
Это действительно расточительно и вызывает большие накладные расходы на больших наборах, но я действительно, действительно, не хочу углубляться в базу данных, чтобы выяснить внутреннюю работу Орчарда и создавать длинные и сложные запросы HQL каждый раз, когда я хочу сделать что-то подобное.
Есть ли способ переписать второй запрос с помощью методов IContentQuery без значительного снижения производительности?
1 ответ
Я работаю над чем-то похожим (возможность запрашивать данные модели с динамическим именем). К сожалению, я не нашел ничего, что облегчало бы это.
Метод, который я нашел, который работает, это делать простые SQL-запросы к базе данных. Проверьте этот модуль на предмет синтаксиса, если вы позже захотите копаться в базе данных.