繁体   English   中英

为什么在 Razor 视图中使用 @model IQueryable<>

[英]Why use @model IQueryable<> in the Razor View

在 Razor 视图中使用 @model IQueryable<> 是个好主意吗? 您会在 Razor 视图中使用 @model IQueryable<> 任何合适的场景吗? 我刚刚用旧代码中的 List<> 替换了 IQerable<>。 公司里没有老开发商可问。

@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 代码。 不是用于渲染的简单、静态、结构良好的对象。 (性能问题)

收集评论和答案后(感谢那些)

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

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

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

事实并非如此, IQueryable使用的内存比IEnumerable 使用IEnumerable您可以将对象保存在内存中,因此您必须为集合中的每个对象分配空间。 IQueryable定义了查询数据的接口,所以你不需要在内存中存储任何东西。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM