有人可以告诉我以下查询是多次调用数据库还是只调用一次?
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
答案 0 :(得分:3)
这完全取决于您对bizItems
变量的操作,因为在您运行此代码后,只会运行COUNT(*)
个查询。这是因为item
包含IQueryable
,它是查询的描述(运行的意图),而不是操作的结果。只有当您开始使用foreach
或.Count()
等运算符开始迭代此查询时,才会运行查询。除此之外,BusinessProfile
和Products
属性也可能包含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)
这肯定会导致两次通话。