为什么要使用@model IQueryable<>在剃刀视图中

时间:2018-02-07 15:05:44

标签: c# asp.net-mvc razor

使用@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>

编辑前: 我以前的观点,

  1. 花费更多内存(资源问题)
  2. 操纵模型的方式将依赖于服务器端,很难转移到前端javascript。 (分离关注)
  3. 很可能会生成更多围绕HTML的C#LINQ代码。不是用于渲染的简单,静态,结构良好的对象。 (表现关注)
  4. 收集评论和答案后(感谢那些)

    1. 意外内存使用
    2. 意外查询计数
    3. 违反MVC模式

1 个答案:

答案 0 :(得分:2)

要回答您的问题 - 否,没有理由在视图中使用IQueryable<T>

IQueryable<T>的全部目的是提供允许您编写C#代码的机制,该代码可以转换为其他程序/工具可理解的其他形式。在这种情况下,假设您正在使用实体框架,IQueryable<T>接口定义了方法,允许实体框架将您的查询从C#转换为SQL。这可以使用expression trees完成。使用表达式树是IEnumerable<T>IQueryable<T>之间的主要区别。

事实并非如此,IQueryable使用的内存多于IEnumerable。使用IEnumerable,您可以将对象保留在内存中,因此必须为集合中的每个对象分配空间。 IQueryable定义了查询数据的界面,因此您无需在内存中存储任何内容。

在您的视图中,您需要能够遍历集合并显示特定的数据集。要做到这一点,IEnumerable提供的方法绰绰有余。在您的视图中使用IQueryable对您没有任何好处,但可能会导致很多问题,如评论中已经提到的那样。