在MVC Razor中从数据库获取数据时LINQ查询性能问题

维沙尔·我·帕蒂尔

问题陈述:我正在尝试使用LINQ查询从数据库绑定多表数据以查看视图,这需要更多时间。我在db中有大约10000条记录。有人建议使用IQueryable而不是IEnumerable,但这会影响我当前的代码(在View和Controller中)?还是不使用它就可以做到这一点?

我应该怎么做才能提高加载结果的性能?? 我做错了什么?请建议我一些更好的方法...

控制器:

public ActionResult Index()
    {
        var result = (from pr in db.Prod.AsEnumerable()
                      join s in db.Shift.AsEnumerable() on pr.Shift equals s.ShiftID
                      join m in db.Module.AsEnumerable() on pr.Module equals m.ModuleID
                      select new GlobalModel()
                      {
                          prodModelIndex = pr,
                          prodModel = prodModel,
                          shiftModel = s,
                          moduleModel = m,
                          ddlShift = objTransactionGeneralController.GetAllShift(),
                          ddlModule = objTransactionGeneralController.GetAllModule()

                      }).ToList();
    return PartialView(result);

    }





   public TransGeneralModel GetAllModule()
    {

        objTransGeneralModel.ddlModule = (from m in db.Module.AsEnumerable()
                                           select new SelectListItem
                                           {
                                               Value = m.ModuleID.ToString(),
                                               Text = m.ModuleName,
                                           }).ToList();


        return objTransGeneralModel;
    }

    public TransGeneralModel GetAllShift()
    {

        objTransGeneralModel.ddlShift = (from s in db.Shift.AsEnumerable()
                                          select new SelectListItem
                                          {
                                              Value = s.ShiftID.ToString(),
                                              Text = s.ShiftName,
                                          }).ToList();


        return objTranGeneralModel;
    }

视图:

@model IEnumerable<SIA.Models.Trans.GlobalModel>

@using GridMvc.Html

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
    ViewBag.Title = "Index";

    }

    <link rel="stylesheet" href="@Url.Content("~/Content/jquery.dataTables.min.css")">
    <script src="@Url.Content("~/Scripts/jquery-2.1.1.min.js")"></script>


    <h2>Details</h2>
    <hr />

    <div style="width: 1000px; padding-left: 70px">
        @Html.Partial("Create")
        <br />
    </div>

    <h5 class="pull-right">
        <b class="fa fa-keyboard-o" style="color: blue"></b>
        @Ajax.ActionLink("Edit", "ProdEdit", "Prod", new { }, new AjaxOptions
    {
        InsertionMode = InsertionMode.Replace,
        UpdateTargetId = "prod-details",
        HttpMethod = "GET",
    }, new { style = "color:blue" })
    </h5>

    <br />
    @using (Html.BeginForm())
    {
        @Html.AntiForgeryToken()
        @Html.ValidationSummary(true)
        if (Model.FirstOrDefault().prodModelIndex != null)
        { 

        <div id="prod-details">
            <table class="table table-striped" id="tblProdDetails">
                <thead>
                    <tr>

                        <th>
                            @Html.DisplayNameFor(model => model.FirstOrDefault().prodModelIndex.ProdID)
                        </th>
                        <th>
                            @Html.DisplayNameFor(model => model.FirstOrDefault().prodModelIndex.Date)
                        </th>
                        <th>
                            @Html.DisplayNameFor(model => model.FirstOrDefault().prodModelIndex.Module)
                        </th>
                        <th>
                            @Html.DisplayNameFor(model => model.FirstOrDefault().productionModelIndex.Shift)
                        </th>

                        <th>
                            @Html.DisplayNameFor(model => model.FirstOrDefault().prodModelIndex.Hour)
                        </th>
                        <th>
                            @Html.DisplayNameFor(model => model.FirstOrDefault().prodModelIndex.Output)
                        </th>

                    </tr>
                </thead>
                <tbody>
                    @foreach (var item in Model)
                    {
                        <tr id="[email protected]">


                            <td>
                                @Html.DisplayFor(modelItem => item.prodModelIndex.ProdID)
                            </td>
                            <td>
                                @Html.DisplayFor(modelItem => item.prodModelIndex.Date)
                            </td>
                            <td>
                                @Html.DisplayFor(modelItem => item.moduleModel.ModuleName)
                            </td>
                            <td>
                                @Html.DisplayFor(modelItem => item.shiftModel.ShiftName)
                                @Html.HiddenFor(modelItem => item.prodModelIndex.Shift)
                            </td>

                            <td>
                                @Html.DisplayFor(modelItem => item.prodModelIndex.Hour)
                            </td>
                            <td>
                                @Html.DisplayFor(modelItem => item.prodModelIndex.Output)
                            </td>
                        </tr>
                    }
                </tbody>
            </table>

        </div>
        }
    }

    <script>

        $(document).ready(function () {

            $('#tblProdDetails').dataTable({
                "order": [[1, "desc"], [3, "asc"]]

            });

        });
    </script>

    @section Scripts {
        @Scripts.Render("~/bundles/jqueryval")
        @Scripts.Render("~/Scripts/jquery.dataTables.min.js")
        <script type='text/javascript'>
            $(function () {
                $('.datepicker').datepicker({
                    format: "dd M yyyy",
                }).on('changeDate', function (e) {
                    $(this).datepicker('hide');
                });
            })

        </script>
    }
费利佩·奥里亚尼

首先,当您调用ToList()AsEnumerable()或之类的方法时FirstOrDefault(),它将在数据库上执行查询。在您的情况下,最好删除它们以使用命中单个查询joins

var result = (from pr in db.Prod
                      join s in db.Shift on pr.Shift equals s.ShiftID
                      join m in db.Module on pr.Module equals m.ModuleID
                      select new GlobalModel()
                      {
                          prodModelIndex = pr,
                          prodModel = prodModel,
                          shiftModel = s,
                          moduleModel = m

                      }).ToList();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在MVC中从数据库Linq到Sql查询中获取最小值和最大值?

MVC 查询不会从数据库中获取所有记录

在 .net MVC 中显示多个数据库查询

我在Spring MVC中从数据库检索值时正在获取对象

使用MVC从数据库获取行数

ASP.NET MVC 5-从数据库中选择数据的LINQ查询

Razor,而不是 MVC:如何调用页面模型方法在按钮单击时更新数据库

在 MVC5 Web 应用程序中更新数据库中的值时遇到问题

MVC的新手无法从数据库获取数据

如何在ASP.NET MVC 5 Razor数据库中更新表

从 SQL 数据库中获取数据到 Bootstrap MVC 中的 html 悬停下拉列表

如何从 ASP.NET Core MVC 中的数据库中获取相关数据

Razor中的MVC数据注释

如何从ASP.NET WebAPI MVC中的多个数据库获取数据

是否可以使用过程从数据库MVC样式中获取数据?

无法使用spring-mvc和hibernate从数据库中获取数据

MVC4 Linq数据库调用

在MVC回发上重新查询数据库

从数据库读取MVC数据

如何从统计类型数据的数据库即时获取枚举中的数据?在asp.net核心mvc中

如何在自定义MVC中从数据库查询配置?

如何基于特定值查询数据库中的列MVC ASP.NET Core

asp.net MVC 应用程序中的更新数据库问题

MVC 5-数据库中的HTML内容-路径问题

如何使用LINQ在ASP.NET MVC中为数据库上下文中的3个不同表编写通用查询?

从数据库中获取对象的父ID(由MVC通过虚拟ICollection创建)

在 MVC 的引导模式弹出窗口中获取 textboxFor 中的数据库值

从数据库MVC4的下拉列表中获取运行时错误

从MVC中的数据库中检索ID