我正在使用.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());
}
答案 0 :(得分:9)
您想要查询两件事 - 项目总数和项目子集。所以你需要运行两个查询:
// 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());
}
答案 1 :(得分:1)
我不知道如何在不分裂的情况下获得计数(希望其他人也这样做),但在你的情况下,我建议:
//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());
}
答案 2 :(得分:-3)
IEnumerables和LINQ用于创建选择链。在实际开始迭代之前,没有执行任何操作(创建选择链除外)。
这看起来很神奇,因为它大大提升了性能,因为尝试使用列表实现相同的功能需要在列表上进行多次迭代。
但是当你开始不止一次地迭代一个可枚举的时候,你就会购买LINQ的优雅和多种操作,这会使你的性能优势降到零以下。
换句话说:将你的linq表达式转换为数组并继续。
var Results = (from results in db.FindWords(term)
orderby results.word
select results.word).Take(100).ToArray();
现在你可以计算,迭代而不会丢失性能。