我是从所有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的类型。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top