题
我是从所有3个表一次获取数据,以避免网络延迟。提取的数据是相当快,但是当我通过使用了大量的时间,结果环
Int32[] arr = { 1 };
var query = from a in arr
select new
{
Basket = from b in ent.Basket
where b.SUPERBASKETID == parentId
select new
{
Basket = b,
ObjectTypeId = 0,
firstObjectId = "-1",
},
BasketImage = from b in ent.Image
where b.BASKETID == parentId
select new
{
Image = b,
ObjectTypeId = 1,
CheckedOutBy = b.CHECKEDOUTBY,
firstObjectId = b.FIRSTOBJECTID,
ParentBasket = (from parentBasket in ent.Basket
where parentBasket.ID == b.BASKETID
select parentBasket).ToList()[0],
},
BasketFile = from b in ent.BasketFile
where b.BASKETID == parentId
select new
{
BasketFile = b,
ObjectTypeId = 2,
CheckedOutBy = b.CHECKEDOUTBY,
firstObjectId = b.FIRSTOBJECTID,
ParentBasket = (from parentBasket in ent.Basket
where parentBasket.ID == b.BASKETID
select parentBasket),
}
};
//Exception handling
var mixedElements = query.First();
ICollection<BasketItem> basketItems = new Collection<BasketItem>();
//Here 15 millis has been used
//only 6 elements were found
if (mixedElements.Basket.Count() > 0)
{
foreach (var mixedBasket in mixedElements.Basket){}
}
if (mixedElements.BasketFile.Count() > 0)
{
foreach (var mixedBasketFile in mixedElements.BasketFile){}
}
if (mixedElements.BasketImage.Count() > 0)
{
foreach (var mixedBasketImage in mixedElements.BasketImage){}
}
//the empty loops takes 811 millis!!
解决方案
为什么难为在foreach语句之前检查计数?如果没有结果,在foreach只会立即完成。
您查询实际上都被推迟 - 他们将作为被执行,当你索要数据。不要忘记,你的最外面的查询是LINQ到对象查询:它只是返回调用ent.Basket.Where(...).Select(...)
等等,它实际上并不执行查询的结果
您计划做的所有三个查询一气呵成不实际工作。然而,单独要求的数量,你实际上可能被执行的每个数据库查询两次 - 一次刚开计数和一次结果
我强烈建议你摆脱这个代码的“优化”,这是使其更加复杂的和的慢的不仅仅是编写你可以在最简单的代码。
我不知道得到的LINQ to SQL(或LINQ到EF)在一个调用执行多个查询的任何方式 - 但这种做法肯定是不会做的。
另外一个小的提示是在这种情况下无关紧要,但在LINQ是有用的对象 - 如果你想找出是否有一个集合中的任何数据,只是用Any()
代替Count() > 0
- 这样它可以作为停止一旦它发现任何东西。
其他提示
您正在使用的foreach循环IEnumerable
。实现只有当它的要求来准备数据。就这样,我建议在上面的代码懒洋洋地访问您的数据 - 也就是说,只有当你列举的项目
Count()
其实际情况。)
把一个System.Diagnostics.Stopwatch
呼叫周围Count()
,看看这是否是服用大量的,你看到的时间。
我不能进一步置评这里,因为你没有你的代码示例中指定ent
的类型。
不隶属于 StackOverflow