首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >列表还是IEnumerable用于.NET核心模型?

列表还是IEnumerable用于.NET核心模型?
EN

Stack Overflow用户
提问于 2020-08-12 16:59:58
回答 2查看 1.8K关注 0票数 1

假设我有一个在控制器上定义为@model IEnumerable<ViewModel>的视图,该数据由实体框架提供,因此是一个IQueryable

我想像这样迭代数据:

代码语言:javascript
运行
复制
@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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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实现来改进内存中的排序和查询。例如:

代码语言:javascript
运行
复制
public class MyModel 
{
   public ICollection<SomeSubModel> SomeSubModels { get; private set; } = new HasSet<SomeSubModel>();
}

(另外,如果您有一个大列表,那么使用分页是很好的做法。)

票数 3
EN

Stack Overflow用户

发布于 2020-08-13 02:27:04

这里是一个好文章,您可以检查它,它探索了IEnumerable、IList和IQueryable的用法,以及它们之间的区别:

  • 当我们想迭代处理进程内内存的对象集合时,IEnumerable非常有用。
  • 当我们想要迭代对象集合时,IQueryable是非常有用的,这些对象处理针对数据源或远程数据库(如Server )的临时查询。
  • 当我们希望在集合中的特定索引位置执行诸如添加、删除或获取项之类的操作时,IList非常有用。

就个人而言,我更喜欢在数据模型中使用ICollection,并使用它从数据库读取/更新相关实体。此外,我们都应该知道IQueryable是从IEnumerable继承来的,所以无论IEnumerable能做什么,我们也可以用IQueryable来实现。

代码语言:javascript
运行
复制
public class Course
{  
    public int CourseID { get; set; }  
    public ICollection<Enrollment> Enrollments { get; set; }
    public ICollection<CourseAssignment> CourseAssignments { get; set; }
}

然后,在控制器中,使用ToList或ToListAsync方法将数据返回到视图。

代码语言:javascript
运行
复制
public async Task<IActionResult> Index()
{
    var courses = _context.Courses
        .Include(c => c.Department)
        .AsNoTracking();
    return View(await courses.ToListAsync());
}

最后,利用IEnumerable对模型进行显示。

代码语言:javascript
运行
复制
@model IEnumerable<ContosoUniversity.Models.Course>
        @foreach (var item in Model)
        {
        }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63381388

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档