如何获得总结果数.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()); } 

您想要查询两件事 – 项目总数和项目子集。 所以你需要运行两个查询:

  // 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(); 

现在你可以计算,迭代而不会丢失性能。