在实体框架中,我应该在我的ViewModel和存储库中使用List <myentity>还是IQueryable <myentity> </myentity> </myentity>

时间:2011-06-08 13:12:01

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

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

1个问题
EX:
在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或实体列表是否更好。

非常感谢

2 个答案:

答案 0 :(得分:2)

如果您只是简单地遍历该集合,那么最好使用IEnumerable<MyEntity>,这实际上就是您在使用List时所做的事情,但不限制自己使用特定类型。

你不应该真的需要在视图级别使用IQueryable<MyEntity>,因为所有昂贵的查询应该在数据到达View时已经完成,你不应该做任何真实的在该级别进行处理 - 在模型中完成所有操作,或者如果需要在Controller中,但不在视图中。

答案 1 :(得分:0)

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

在我的代码中,我让我的Controller调用服务来从存储库中获取数据。

var employees = MyService.GetEmployees()

然后将其作为员工列表进入ViewModel。

服务返回Controller,即其客户端,IEnumerable类型的项目。由于两个原因,它不会返回IQueryable:

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

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

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

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

在我的代码中,Repository会将IQueryable返回给Service,因为这里发生了过滤,我想使用LINQ。

我希望这有助于某人:)