C# 优化linq数据提取所需的帮助
我一次从所有3个表中提取数据,以避免网络延迟。获取数据非常快,但当我循环查看结果时,会占用大量时间C# 优化linq数据提取所需的帮助,c#,linq,materialized-views,C#,Linq,Materialized Views,我一次从所有3个表中提取数据,以避免网络延迟。获取数据非常快,但当我循环查看结果时,会占用大量时间 Int32[] arr = { 1 }; var query = from a in arr select new { Basket = from b in ent.Basket where b.SUPERBASKETID == parentId
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循环中使用IEnumerable。实现只需要在需要时准备数据。通过这种方式,我建议上面的代码是在惰性地访问您的数据——也就是说,只有当您枚举调用Count时实际发生的项时
在呼叫周围放置System.Diagnostics.Stopwatch进行计数,并查看这是否占用了您看到的大部分时间
我不能在这里进一步评论,因为您没有在代码示例中指定ent的类型。为什么要在foreach语句之前检查计数?如果没有结果,foreach将立即完成 您的查询实际上都被延迟了—它们将在您请求数据时执行。不要忘记,最外层的查询是LINQtoObjects查询:它只是返回调用ent.Basket的结果。。。等它实际上并不执行查询 您一次完成所有三个查询的计划实际上不起作用。但是,通过单独请求计数,您实际上可能会执行每个数据库查询两次——一次只是获取计数,一次用于结果 我强烈建议您摆脱这段代码中的优化,这些优化使它比只编写最简单的代码复杂得多,速度也慢得多 我不知道有什么方法可以让LINQtoSQL或LINQtoEF在一个调用中执行多个查询,但这种方法肯定做不到 另一个小提示在本例中是不相关的,但在LINQ to对象中可能很有用-如果您想知道集合中是否有任何数据,只需使用any而不是Count>0-这样它可以在找到任何数据后立即停止