Linq to Entities 4.0 - 在单个查询中优化查询和多次调用数据库

时间:2010-08-05 18:52:16

标签: c# linq .net-4.0 linq-to-entities subquery

有人可以告诉我以下查询是多次调用数据库还是只调用一次?

var bizItems = new
{
    items = (
        from bl in db.rc_BusinessLocations
        orderby bl.rc_BusinessProfiles.BusinessName
        select new BusinessLocationItem
        {
            BusinessLocation = bl,
            BusinessProfile = bl.rc_BusinessProfiles,
            Products = bl.rc_InventoryProducts_Business
        })
        .Skip(pageSkip).Take(pageSize),

    Count = db.rc_BusinessLocations.Count()
};

我真的需要从查询中获取Count(),我找不到另一种方法来做到这一点,所以如果你有一些更优化的代码,请随意分享!

提前致谢!

GWAR

3 个答案:

答案 0 :(得分:3)

这完全取决于您对bizItems变量的操作,因为在您运行此代码后,只会运行COUNT(*)个查询。这是因为item包含IQueryable,它是查询的描述(运行的意图),而不是操作的结果。只有当您开始使用foreach.Count()等运算符开始迭代此查询时,才会运行查询。除此之外,BusinessProfileProducts属性也可能包含IQueryable

那么,让我们来看看你可以用这段代码做些什么:

foreach (var item in bizItems.items)
{
    Console.WriteLine(item.BusinessLocation.City);

    foreach (var profile in item.BusinessProfile)
    {
        Console.WriteLine(profile.Name);
    }

    foreach (var product in item.Products)
    {
        Console.WriteLine(product.Price);
    }

    Console.WriteLine(item.Count);
    Console.WriteLine();
}

所以,如果你再次问我,看看这段代码,将有多少查询发送到数据库,我的答案是:2 + 2 * bizItems.items中的项目数。因此查询的数量将介于2和(2 + 2 * pageSize)之间。

答案 1 :(得分:1)

你应该查看Scott Guthrie的post使用LINQ to SQL Debug Visualizer。这将允许您准确查看将从LINQ语句生成的SQL。

答案 2 :(得分:0)

这肯定会导致两次通话。