Как получить общее количество результатов до.Take() - но при использовании.Take ()
Я использую.Take(), чтобы получить фиксированное количество результатов.
Каков наилучший способ получить TotalCountBeforeTake
(то есть как если бы я не использовал.Take())?
Могу ли я получить TotalCountBeforeTake
без запуска запроса дважды?
var Results = (from results in db.FindWords(term)
orderby results.word
select results.word).Take(100);
//just to get the total record count
int TotalCountBeforeTake = (from results in db.FindWords(term)
select results.word).Count();
// only showing 100 out of TotalCountBeforeTake results,
// but in order to know the TotalCountBeforeTake I had to run the query twice.
foreach (var result in Results)
{
Console.Write(result.ToString());
}
3 ответа
Вы хотите запросить две вещи - общее количество предметов и подмножество предметов. Итак, вам нужно выполнить два запроса:
// Define queries
var query1 = from results in db.FindWords(term)
orderby results.word
select results.word;
var query2 = query1.Take(100);
// Run queries
int totalCountBeforeTake = query1.Count();
foreach (var result in query2)
{
Console.Write(result.ToString());
}
Я не знаю, как подсчитать счет, не разделив его (надеюсь, кто-то другой), но в вашей ситуации я бы предложил:
//first get the records
var query = (from results in db.FindWords(term)
orderby results.word
select results.word).ToList();
//get the total record count
int TotalCountBeforeTake = query.Count();
// only showing 100 out of results,
foreach (var result in query.Take(100))
{
Console.Write(result.ToString());
}
IEnumerables и LINQ используются для создания цепочки выбора. Перед тем, как вы действительно начнете выполнять итерации, ничего не выполняется (кроме создания цепочки выбора).
Это кажется волшебным, поскольку резко повышает производительность, потому что попытка достичь того же с помощью списков требует нескольких итераций по списку (ам).
Но когда вы начинаете перебирать перечисляемый более одного раза, вы покупаете элегантность LINQ с несколькими операциями, которые снижают выигрыш в производительности до нуля и ниже.
Другими словами: преобразуйте выражение linq в массив и продолжайте.
var Results = (from results in db.FindWords(term)
orderby results.word
select results.word).Take(100).ToArray();
Теперь вы можете считать, повторять без потери производительности.