Asp.net mvc 2 在实体框架中,我应该使用List<;MyEntity>;或IQueryable<;MyEntity>;在我的ViewModel和存储库中

Asp.net mvc 2 在实体框架中,我应该使用List<;MyEntity>;或IQueryable<;MyEntity>;在我的ViewModel和存储库中,asp.net-mvc-2,entity-framework-4,Asp.net Mvc 2,Entity Framework 4,在ViewModel中,我应该创建列表还是IQueryable,然后在视图中使用它 1个问题 例如: 在ViewModel中,我有这个属性 public List<MyEntity> ListEntity {get;set;} public IQueryable<MyEntity> ListIQEntity {get;set;} public List ListEntity{get;set;} 公共IQueryable ListIQEntity{get;set;} 然

在ViewModel中,我应该创建列表还是IQueryable,然后在视图中使用它

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

public List<MyEntity> ListEntity {get;set;}
public IQueryable<MyEntity> ListIQEntity {get;set;}
public List ListEntity{get;set;}
公共IQueryable 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>
    foreach(Model.listenty中的变量e) {
  • 如果您只是在集合中循环,那么最好使用
    IEnumerable
    ,这基本上就是您在使用列表时所做的,但不限于使用特定类型


    您不应该真正需要在视图级别使用
    IQueryable
    ,因为当数据到达视图时,所有昂贵的查询都应该已经完成,并且您不应该在该级别执行任何真正的处理—在模型中执行所有操作,或者如果需要,在控制器中执行所有操作,但不在视图中执行。

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

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

    var employees = MyService.GetEmployees()
    
    然后作为员工列表进入ViewModel

    该服务向控制器及其客户端返回IEnumerable类型的项。由于两个原因,它不返回IQueryable:

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

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

    • 如果需要进一步过滤,可以导入名称空间并将列表强制转换为IQueryable,然后使用LINQ进行过滤
    该服务不应假定客户端可能希望进行过滤,并将返回IQueryable“以防万一”

    在我的代码中,存储库将向服务返回IQueryable,因为过滤在这里进行,我想使用LINQ


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

    好的,List和IEnumerable之间有什么区别吗。在存储库中,我应该返回IEnumerable还是IQueryableList实现IEnumerable接口,所以使用哪种接口取决于您。我个人更喜欢返回IEnumerable,因为这意味着我的代码比使用concret时受的约束更少在存储库中,我仍然会返回IEnumerable,因为存储库是您应该执行所有处理工作的地方,所以不需要返回IQueryable集合。