如何获得总结果数.Take() - 但是在使用时.Take()

时间:2013-08-24 09:12:22

标签: c# linq 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 个答案:

答案 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();

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