Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 与使用以前的内存中集合相比,Chaining.SelectMany()具有更好的性能_C#_Entity Framework_Linq - Fatal编程技术网

C# 与使用以前的内存中集合相比,Chaining.SelectMany()具有更好的性能

C# 与使用以前的内存中集合相比,Chaining.SelectMany()具有更好的性能,c#,entity-framework,linq,C#,Entity Framework,Linq,我有一个向下钻取图表的方法,可以根据用户单击的列获取数据。使用实体框架5,我的EF类如下psuedocode: 父类A、B:A、C:B、D:B 所以A有很多B,B可以有很多C和D 该方法为单击的列设置了一个开关,在switch语句之前,我加载了B的集合,因为a从未在图表上使用过 var bList = _db.ACollection.SelectMany(x => x.BCollection).ToList(); switch (columnClicked) { case B:

我有一个向下钻取图表的方法,可以根据用户单击的列获取数据。使用实体框架5,我的EF类如下psuedocode:

父类A、B:A、C:B、D:B

所以A有很多B,B可以有很多C和D

该方法为单击的列设置了一个开关,在switch语句之前,我加载了B的集合,因为a从未在图表上使用过

var bList = _db.ACollection.SelectMany(x => x.BCollection).ToList();
switch (columnClicked)
{
  case B:
    var items = bList.Select(//project to display item for chart);
  case C:
    var items = bList.SelectMany(x => x.CCollection).ToList().Select(//project);
  case D:
    //same as C
}
这大约需要两秒钟才能返回40行左右的数据

我发现不用bList,我可以举个例子:对于caseCuse

_db.ACollection.SelectMany(x => x.BCollection).SelectMany(x => x.CCollection).ToList().Select(//project) 
速度提高近10倍

有人能解释这是什么吗

编辑以澄清 在案例C中,我投影到一个图表细节项,我有一个方法可以调用来设置文本显示时的颜色

bList.SelectMany(x => x.CCollection).ToList().Select(c => new ChartDetailitem
{
  // other properties...
  TextColor = SetColor(c.DataColor)
})

开始构建bList时,请尝试删除ToList。你不需要一个列表,只需要为每个案例使用ToList。你是怎么估计出2秒的时间的?您应该使用秒表仔细地对其进行基准测试,排除其他代码消耗的任何前后时间。事实上-重要的是,ToList之后的任何事情都必须在本地发生,而如果您还没有调用ToList,EF可以将查询的进一步部分放入SQL。@我之所以要ToList,是因为在案例B中,在select中投影时,我必须调用一些方法来处理数据。另外,我有VS2015,所以我只是根据调试时显示的时间来计算。@JonSkeet那么我应该将bList移到每个案例中,因为最后两个案例必须使用不同于第一个的集合吗?@JB06如果是这样的话,您当然不会从服务器性能中获益,一旦你想修改一些属性,如你所说,使用L2O本地是你的选择。但我不确定您是否正确测量了时间,不要真的认为它太慢,2秒确实是一个很大的延迟,而只有40行?,您的查询也足够简单。我想可能有一些代码你还没有发布。