假设我有一个在控制器上定义为@model IEnumerable<ViewModel>的视图,该数据由实体框架提供,因此是一个IQueryable。
我想像这样迭代数据:
@if (Model != null && Model.Count() > 0)
{
@foreach (var item in Model)
{
<tr>
<td>
@item.firstProp
</td>
<td>
@item.secondProp
</td>
</tr>
}
}
else
{
<tr>
<td>
No data to display.
</td>
</tr>
}我只想在至少有一个项的情况下迭代,否则我想显示一个不同的消息。因为我使用的是IEnumerable,所以检查计数需要一次到数据库的旅行,另一次要迭代foreach循环。我总是可以使用List代替,但我几乎总是看到使用IEnumerable定义的模型。使用List是一个很好的解决方案,还是在定义模型时应该始终使用IEnumerable?
发布于 2020-08-12 20:10:49
首先分析了List<T>、IEnumerable<T>和IQueryable<T>的区别。List<T>的内容将始终加载到内存中,因为它在后台使用一个数组。
IEnumerable<T>的内容将只将请求的项加载到内存中。编译器在使用IEnumerable<T>编译具有yield return T的方法时设置状态机。因此,在这种情况下,每次只有一个项将被加载到内存中。
IQueryable<T>是IEnumerable<T>的“特殊”版本。专为查询数据源而设计,并由数据提供程序实现。比如EF,NHibernate。因此,当您告诉EF用.ToListAsync<T>()获取数据时,EF只会访问数据库并执行生成的查询。有关IQueryable<T>的更多信息,请参见文档。
我只使用ICollection<T>和HasSet实现来改进内存中的排序和查询。例如:
public class MyModel
{
public ICollection<SomeSubModel> SomeSubModels { get; private set; } = new HasSet<SomeSubModel>();
}(另外,如果您有一个大列表,那么使用分页是很好的做法。)
https://stackoverflow.com/questions/63381388
复制相似问题