使用@model IQueryable<>在Razor View中是一个好主意?任何合适的场景都会使用@model IQueryable<>在剃刀视图?我刚刚更换了IQuerable<>与列表<>来自遗产代码。该公司没有老年开发人员要求。
@model IQueryable<T>
@{
ViewBag.Title = "Index";
}
<table class="table">
<tr>
<th></th>
<th>Sn</th>
<th>Kind</th>
</tr>
@{
var count = 1;
}
@using (Entities db = new Entities())
{
foreach (var item in Model)
{
<tr>
<td>
<button type="button" class="btn_delKind btn btn-danger" data-kind-id="@item.id">Delete</button>
</td>
<td>@count</td>
<td>
@switch (item.Type)
{
case 0:
@Html.Raw("All")
break;
default:
@Html.Raw(db.LookupType.Find(item.Type).Name)
break;
}
</td>
</tr>
count = count + 1;
}
}
</table>
编辑前: 我以前的观点,
收集评论和答案后(感谢那些)
答案 0 :(得分:2)
要回答您的问题 - 否,没有理由在视图中使用IQueryable<T>
。
IQueryable<T>
的全部目的是提供允许您编写C#代码的机制,该代码可以转换为其他程序/工具可理解的其他形式。在这种情况下,假设您正在使用实体框架,IQueryable<T>
接口定义了方法,允许实体框架将您的查询从C#转换为SQL。这可以使用expression trees完成。使用表达式树是IEnumerable<T>
和IQueryable<T>
之间的主要区别。
事实并非如此,IQueryable
使用的内存多于IEnumerable
。使用IEnumerable
,您可以将对象保留在内存中,因此必须为集合中的每个对象分配空间。 IQueryable
定义了查询数据的界面,因此您无需在内存中存储任何内容。
在您的视图中,您需要能够遍历集合并显示特定的数据集。要做到这一点,IEnumerable
提供的方法绰绰有余。在您的视图中使用IQueryable
对您没有任何好处,但可能会导致很多问题,如评论中已经提到的那样。