如何解决清单还是IEnumerable for .NET Core模型?
比方说,我有一个模型定义为@model IEnumberable<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
?
解决方法
首先,List<T>
,IEnumerable<T>
和IQueryable<T>
之间的差异。
List<T>
的内容将始终加载到内存中,因为它在后台使用数组。
IEnumerable<T>
的内容只会将请求的项目加载到内存中。在使用IEnumerable<T>
的{{1}}编译方法期间,编译器会设置状态机。因此,在这种情况下,一次只能将一项加载到内存中。
yield return T
是IQueryable<T>
的“特殊”版本。专为查询数据源而设计,由数据提供者实施。像EF一样,NHibernate。因此,当您告诉EF使用IEnumerable<T>
来获取数据时,EF只会访问数据库并执行生成的查询。
有关.ToListAsync<T>()
的更多信息,请参阅文档。
我个人将IQueryable<T>
与HasSet实现配合使用,以改善内存中的排序和查询。
例如:
ICollection<T>
(另外,如果列表很大,最好使用分页。)
,这里是nice article,您可以检查一下,它探讨IEnumerable,IList和IQueryable的用法,它们之间的区别:
-
当我们要迭代处理进程内内存的对象的集合时,
- IEnumerable很有用。
- IQueryable在我们要迭代对象集合时非常有用,这些对象集合针对数据源或远程数据库(例如SQL Server)进行即席查询。 当我们要在集合中特定索引位置执行诸如添加,删除或获取项目之类的任何操作时,
- IList很有用。
个人而言,我更喜欢在数据模型中使用ICollection,并使用它从数据库中读取/更新相关实体。此外,我们都应该知道IQueryable是从IEnumerable继承的,所以无论IEnumerable可以做什么,我们也可以使用IQueryable来实现。
public class Course
{
public int CourseID { get; set; }
public ICollection<Enrollment> Enrollments { get; set; }
public ICollection<CourseAssignment> CourseAssignments { get; set; }
}
然后,在控制器中,使用ToList或ToListAsync方法将数据返回以查看。
public async Task<IActionResult> Index()
{
var courses = _context.Courses
.Include(c => c.Department)
.AsNoTracking();
return View(await courses.ToListAsync());
}
最后,使用IEnumerable显示模型。
@model IEnumerable<ContosoUniversity.Models.Course>
@foreach (var item in Model)
{
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。