MVC5 / EF / LINQ - 多个选择计数查询返回到视图,最佳做法

时间:2015-02-21 00:26:17

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

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

我已经阅读了关于如何运行选择县查询的最佳方式的不同意见 在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));                        
    }

&#39;

1 个答案:

答案 0 :(得分:1)

正如Osadella在评论中所提到的,您可以使用实体框架生成的POCO以更加理智的方式执行此操作。

您可以在SQL中执行此操作,因为您已经知道了。在SQL中使用count的问题在于它不是非常高效。您不会注意到与您提到的数据集有很大差异,但是在使用SQL count时,大型企业应用程序会受到影响。

要回答你的问题,你应该在POCO上使用LINQ(EF中DbContext生成的大数据模型),原因很简单,你可以使用它。 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