Gon*_*alo 3 c# asp.net ienumerable list
我的问题很简单.我什么时候应该使用List,IEnumerable和ArrayList.
这是我的情景.我正在使用LINQ在Web应用程序中工作.信息以IEnumerable的形式返回:
IEnumerable<Inventory> result = from Inventory i in db where....
Run Code Online (Sandbox Code Playgroud)
我不确定IEnumerable是如何工作的,但是每个操作都需要花费很多时间来执行.更具体地说,result.Count(),result.ElementAt(i),result.ToList等,每个操作都需要相当长的时间.
所以,我想知道我是否应该通过执行result.ToList将其视为List,而不是使用IEnumerable变量.
谢谢!
如果我理解你正在做什么,你有一个查询from Inventory i in db select i,然后你对结果做了几个操作:
var count = result.Count();
var fifth = result.ElementAt(5);
var allItems = result.ToList();
Run Code Online (Sandbox Code Playgroud)
现在考虑将查询作为不同类型时会发生什么:
IQueryable<T>
var result = from Inventory i in db select i;
IQueryable<Inventory> result = from Inventory i in db select i;
Run Code Online (Sandbox Code Playgroud)
上面两行是相同的.它们实际上并没有进入数据库,只是创建了查询的表示.如果你有这个,Count()将执行一个SQL查询,比如SELECT COUNT(*) FROM Inventory,ElementAt(5)将执行另一个只占用表中第五项的查询,并ToList()执行类似的操作SELECT * FROM Inventory,但这就是我们想要的.
IEnumerable<T>
IEnumerable<Inventory> result = from Inventory i in db select i;
Run Code Online (Sandbox Code Playgroud)
再次执行此操作不会进入数据库,它只会创建查询的表示形式.但它是一种不能使用特定方法的表示IQueryable<T>,因此任何LINQ操作都将枚举该集合,该集合将执行类似的SQL查询SELECT * FROM Inventory.
因此,对于示例:Count()将SELECT * …仅执行查询以计算结果中的项目.ElementAt(5)将再次执行整个查询,只丢掉除第五个以外的所有项目.并且ToList()将执行查询一次.
List<T>
List<Inventory> result = (from Inventory i in db select i).ToList();
Run Code Online (Sandbox Code Playgroud)
这实际上会SELECT * FROM Inventory立即执行一次查询.您执行的所有操作result都不会触及数据库,它们将在内存中完成.
你应该从中拿走什么?首先,永远不要使用IEnumerable<T>数据库查询的类型.它表现糟糕.
如果要对结果进行多个不同的操作,使用IQueryable<T>可能是最佳解决方案.
如果您想要检索整个结果,请尽快使用ToList()(或ToArray()),然后使用结果List<T>.
| 归档时间: |
|
| 查看次数: |
3308 次 |
| 最近记录: |