6

我正在使用 .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());
        }
4

3 回答 3

10

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

    // 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());
    }
于 2013-08-24T09:20:45.630 回答
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());
}
于 2013-08-24T09:21:00.920 回答
-3

IEnumerables 和 LINQ 用于创建选择链。在您真正开始迭代之前,没有执行任何操作(除了创建选择链)。

这似乎很神奇,因为它极大地提高了性能,因为尝试使用列表实现相同的目标需要对列表进行多次迭代。

但是,当您不止一次地开始迭代一个可枚举时,您就是在购买具有多个操作的 LINQ 的优雅,这会将您的性能优势降低到零或以下。

换句话说:将您的 linq 表达式转换为数组并继续。

 var Results = (from results in db.FindWords(term)
                     orderby results.word
                     select results.word).Take(100).ToArray();

现在您可以计数、迭代而不会损失性能。

于 2013-08-24T09:19:32.817 回答