【发布时间】:2016-09-09 20:48:30
【问题描述】:
我在对象列表 (List-ParentClass) 中有一个对象列表,其中一个对象是嵌套列表 (List-ChildClass)。为了填充 List-ChildClass,我使用了一个 foreach 循环,如下所示。我还嵌套了一个 linq 查询,如下所示。
在这一点上,我遇到了一些性能问题,我觉得有更好的方法来做到这一点,我只是没有找到。
问题:我怎样才能更好/更快地做到这一点?
注意 - 这是一个用 C# 编写的基于 Web 的 .net MVC 应用程序。我使用 EF 回到 SQL 数据库。
public class ParentClass
{
public int pcid { get; set; }
public List<ChildClass> ChildClassList { get; set; }
}
public class ChildClass
{
public int pcid { get; set; }
public int ccid { get; set; }
}
public class DoWork
{
public void ExampleMethodForEach()
{
List<ParentClass> ParentClassList = new List<ParentClass>();
foreach(ParentClass a in ParentClassList)
{
a.ChildClassList = EFDatabase2.where(b => b.pcid == a.pcid).select(b => b.ccid).ToList();
}
}
public void ExampleMethodLinq()
{
var ParentClassList = (from a in EFDatabase
select new ParentClass
{
ccid = a.ccid,
pcid = (from b in EFDatabase2
where b.pcid == a.pcid
select b.ccid).ToList()
//something like this were I nest a query
}).ToList();
}
}
【问题讨论】:
-
如果 database 存在性能问题,不是
list、foreach等,而是 database 责备。最后的查询是什么?查询获取多少条记录?如果是list within list,请尝试尽可能少地调用:你能一次性获取所有数据,然后将它们组织成你想要的结构吗? -
我在 foreach 中发现的是它访问数据库的次数可能会导致问题。在我当前的应用程序中,我将数据拉入内存然后运行 foreach 循环。这表现得更好,但似乎有点笨拙。我一直认为我可以在一个大查询中完成。
-
就记录数量而言,它相对较小,我们返回一千或两条,但每个列表都有多个列表,其中包含 3 - 10 倍以上的记录。拉这个的查询也有点复杂。因此,深入了解我的情况可能并不那么简单。问题:您认为上述方法是解决这种情况的正常/常用方法吗?
-
所以记录总数(父母和所有孩子)大约是10000-20000。这不是很多。尝试使查询尽可能简单,例如
select b, parent_id from my_table调用一次并获取数据以创建/填充您的结构。
标签: c# .net entity-framework linq list