【问题标题】:In Entity Framework, Should I use List<MyEntity> or IQueryable<MyEntity> in my ViewModel and Repository在实体框架中,我应该在 ViewModel 和存储库中使用 List<MyEntity> 还是 IQueryable<MyEntity>
【发布时间】:2011-09-10 21:01:36
【问题描述】:

在 ViewModel 中,我应该创建一个 List 还是一个 IQueryable,然后在我的 View 中使用它。

1 个问题
例如:
在 ViewModel 我有这个属性

public List<MyEntity> ListEntity {get;set;}
public IQueryable<MyEntity> ListIQEntity {get;set;}

然后在视图中我这样循环。

<ul>
foreach(var e in Model.ListEntity)
{
   <li><%:e.MyInfo</li>
}
</ul>


<ul>
foreach(var e in Model.ListIQEntity )
{
   <li><%:e.MyInfo</li>
}
</ul>

2 个问题

在存储库中,返回 IQueryable 还是返回实体列表更好。

非常感谢

【问题讨论】:

    标签: asp.net-mvc-2 entity-framework-4


    【解决方案1】:

    如果您要简单地遍历集合,那么最好使用IEnumerable&lt;MyEntity&gt;,这实际上是您在使用列表时所做的事情,但不限制自己使用特定的输入。

    您实际上不需要在视图级别使用IQueryable&lt;MyEntity&gt;,因为在数据到达视图时应该已经完成​​了所有昂贵的查询,并且您不应该在视图级别进行任何实际处理那个级别——全部在 Model 中完成,或者如果需要在 Controller 中而不是在 View 中。

    【讨论】:

    • 好的,List 和 IEnumerable 有什么区别。在存储库中,我应该返回一个 IEnumerable 还是一个 IQueryable
    • List 实现了 IEnumerable 接口,所以由你决定使用哪个。我个人更喜欢返回 IEnumerable,因为这意味着我的代码比使用具体类型(例如 List)的约束更少。在存储库中,我仍然会返回 IEnumerable,因为存储库是您应该进行所有处理工作的地方,因此不需要返回 IQueryable 集合。
    【解决方案2】:

    这已经得到解答,但我在寻找自己类似问题的答案时看到了这一点,并且觉得我从中学到的东西可能对其他人有所帮助。

    在我的代码中,我的控制器调用服务以从存储库中获取数据。

    var employees = MyService.GetEmployees()
    

    然后这会作为员工列表进入 ViewModel。

    服务返回给控制器,它的客户端,一个 IEnumerable 类型的项目。它不返回 IQueryable 有两个原因:

    1) IQueryable 依赖于 System.Linq。任何使用我的服务的人都必须在不需要时导入此命名空间*。

    2) 如果客户端需要过滤数据,他们需要告诉服务,例如 var employees = MyService.GetCurrentEmployees() / GetEmployees(someFilter)

    • 如果他们需要进一步过滤,他们可以导入命名空间并将 List 转换为 IQueryable 并使用 LINQ 来完成。

    服务不应该假设客户端可能想要进行过滤并且会返回 IQueryable “以防万一”。

    在我的代码中,存储库会将 IQueryable 返回给服务,因为过滤发生在这里,我想使用 LINQ。

    我希望这对某人有帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      • 1970-01-01
      相关资源
      最近更新 更多