在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或实体列表是否更好。
非常感谢
答案 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)
服务不应该假设客户端可能想要进行过滤,并且将“以防万一”返回IQueryable。
在我的代码中,Repository会将IQueryable返回给Service,因为这里发生了过滤,我想使用LINQ。
我希望这有助于某人:)