【问题标题】:MVC5/EF/LINQ - Multiple Select Count queries returned to a view, best practiceMVC5/EF/LINQ - 多个选择计数查询返回到视图,最佳实践
【发布时间】:2015-02-21 00:26:16
【问题描述】:

我正在创建我的第一个 MVC5 / EF / LINQ 应用程序,我想在一个视图中显示几个(大约 75 个)“Select Count(*)”查询的结果。目的是在主页“仪表板”上显示来自单个表的不同统计信息,以及来自数据库中同一表的“活动”项目列表。

我已经阅读了关于如何以最佳方式运行选择县查询的不同意见 在 LINQ 中...考虑到我需要在页面上运行多少查询,最有效的方法是什么?

一个示例查询是

select count(*) from TableName WHERE LType="A" AND (LDate BETWEEN 02/10/2015 AND 02/25/2015)

public ActionResult Index(string sortOrder, string currentFilter, string searchString, int? page)
    {
        ViewBag.CurrentSort = sortOrder;
        ViewBag.LastNameSortParam = String.IsNullOrEmpty(sortOrder) ? "LastName" : "";
        ViewBag.DateSortParam = sortOrder == "Date" ? "LeadDate" : "Date";
        if (searchString != null)
        {
            page = 1;
        }
        else
        {
            searchString = currentFilter;
        }

        ViewBag.CurrentFilter = searchString;

        var newLeads = from l in db.WebLeads
                       where (l.LoanAgent == null || l.LoanAgent == "hb@mwfinc.com")
                       select l;                           
        if (!String.IsNullOrEmpty(searchString))
        {
            newLeads = newLeads.Where(l => l.LastName.Contains(searchString)
                                   || l.FirstName.Contains(searchString));
        }
        switch (sortOrder)
        {
            case "Date":
                newLeads = newLeads.OrderBy(l => l.LeadDate);
                break;
            case "LeadDate":
                newLeads = newLeads.OrderByDescending(l => l.LeadDate);
                break;
            case "LastName":
                newLeads = newLeads.OrderBy(l => l.LastName);
                break;
            default:
                newLeads = newLeads.OrderByDescending(l => l.LeadDate);
                break;
        }

        int pageSize = 15;
        int pageNumber = (page ?? 1);

        DateTime minDate = System.DateTime.Today;
        DateTime maxDate = System.DateTime.Now;

        // Leads to Be Assigned Daily Count
        var ctPurchTBA = db.WebLeads.Count(x => (x.LoanType == "Home Purchase" || x.LoanType == "CalPATH Home Purchase")
                              && x.LeadDate >= minDate
                              && x.LeadDate <= maxDate);


        return View(newLeads.ToPagedList(pageNumber, pageSize));                        
    }

'

【问题讨论】:

  • 根据表的负载/大小/整体性能考虑,我将采用两种方法: 1. 使用选择计数 (*) 作为子选择的子选择进行选择。您只需将一项传递给 vew 2. 根据表加载/卷上的不同计划加载来自前端的异步请求的总数,以减少 sql 负载。
  • 您能否提供方法 1 的示例?不幸的是,我有点新手,所以你的回答有点过头了。
  • 既然你用的是EF/Linq,为什么不用你的POCO而不是纯sql。类似 var myPoco = YourDBContext.models 然后你可以使用 mypoco 并根据需要查询它
  • 示例:select tab1.numbers1, tab2.numbers2, tab3.numbers3 from (select count(*) as numbers1 from Table1) as tab1, (select count(*) as numbers2 from Table2) as tab2, (select count(*) as numbers3 from Table3) as tab3 但请注意,如果您谈论 75 个表,这对于 SQL 服务器来说是一个性能溢出。我个人会采用异步流程,但这是我个人的看法。

标签: c# asp.net-mvc linq entity-framework


【解决方案1】:

正如 Osadella 在 cmets 中所提到的,您可以使用 Entity Framework 生成的 POCO 以更明智的方式执行此操作。

如您所知,您可以在 SQL 中执行此操作。在 SQL 中使用count 的问题在于它的性能不是很好。您不会注意到与您提到的数据集有任何巨大差异,但值得知道的是,大型企业应用程序在使用 SQL count 时会受到影响。

但是,要回答您的问题,您可能应该在 POCO(由您在 EF 中的 DbContext 生成的大数据模型)上使用 LINQ,原因很简单,您可以使用它。 LINQ 是对 SQL 的一个更简单的抽象,有一些关于 LINQ 好处的相当好的示例here

您可以使用基于 SQL 的 LINQ,也可以使用基于方法的 LINQ,我会使用基于方法的,因为它更易读且更易于编写。

以上代码;

select count(*) 
from TableName 
WHERE LType="A" 
AND (LDate BETWEEN 02/10/2015 AND 02/25/2015)

会变成:

var count = db.TableNames.Count(x => x.LType == "A" 
                                  && x.LDate >= minDate 
                                  && x.LDate <= maxDate);

显然,您还需要在某处定义 minDatemaxDate

【讨论】:

  • 非常感谢您提供的信息。这可能超出了问题的范围,但是如何将该查询的结果返回到我的视图中?我在控制器中设置了查询。控制器还从我正在查询计数的同一个表中返回一个分页记录列表。见下文。我是否正确设置了这个,计数查询是否应该在控制器中?我将控制器中的代码添加到我原来的帖子中......如果我能得到一个如何将它传递给视图的示例,我认为一切都会为我准备就绪。提前谢谢!
  • 你对 View 模型了解多少?
  • 我是来自 Web 表单的 MVC 新手。这是我的第一个应用程序。我有 2 本书,但我一直在将多个模型传递给视图。我为我现有的数据库创建了一个数据库优先模型。在上面的示例中,我想做的所有事情都来自 1 个表,所以我不会只使用 1 个模型吗?
  • 我最近关于使用 View 模型的两个答案:firstsecond
猜你喜欢
  • 1970-01-01
  • 2015-09-01
  • 2018-11-01
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多