如何使用Linq和ToArray()方法防止双往返

时间:2010-01-07 18:33:00

标签: linq arrays

我正在尝试在查询中使用数组而不是列表。但是我必须首先得到计数才能迭代从数据库返回的对象。这是我的代码:

        var FavArray = favorites.OrderByDescending(y => y.post_date).Skip((page - 1) * config.MaxRowsPerPage).Take(config.MaxRowsPerPage).ToArray();
        int FavArrayCount = FavArray.Count();  //Is this a round trip to the database?

        for (int y = 0; y < FavArrayCount; y++)
        {
            q = new PostType();
            q.Title = FavArray[y].post_title;
            q.Date = FavArray[y].post_date;
            q.PostID = FavArray[y].post_id;
            q.Username = FavArray[y].user_username;
            q.UsernameLowered = FavArray[y].user_username.ToLower();
            q.CategoryID = FavArray[y].catid;
            q.CategoryName = FavArray[y].name;
            q.TitleSlug = FavArray[y].post_titleslug;
        }

正如你所看到的,在我开始迭代之前我需要计数,我担心得到计数我会去数据库。这是真的吗?

3 个答案:

答案 0 :(得分:4)

FavArray.Count()不会往返,因为你已经将它转换为一个不再是“LINQ-ified”的数组。

答案 1 :(得分:2)

一旦调用ToArray,它返回的阵列上的任何操作都不会返回到服务器。 (除非你使用外键)

在数组上调用的Count()等LINQ方法将使用常规的LINQ to Objects,并且完全不知道SQL Server。

答案 2 :(得分:1)

除了其他评论(它肯定不会往返;它只是一个数组),你可以使用favArray.Length。