C# MVC5/EF/LINQ-返回到视图的多个选择计数查询,最佳实践

C# MVC5/EF/LINQ-返回到视图的多个选择计数查询,最佳实践,c#,asp.net-mvc,linq,entity-framework,C#,Asp.net Mvc,Linq,Entity Framework,我正在创建我的第一个MVC5/EF/LINQ应用程序,我想在一个视图中显示几个(大约75个)“Select Count(*)”查询的结果。其目的是显示主页“仪表板”上单个表中的不同统计信息,以及数据库中同一表中的“活动”项列表 我读过关于如何以最佳方式运行select county查询的不同意见 在林肯。。。考虑到我需要在页面上运行多少查询,最有效的方法是什么 下面是一个示例查询 select count(*) from TableName WHERE LType="A" AND (LDate

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

我读过关于如何以最佳方式运行select county查询的不同意见 在林肯。。。考虑到我需要在页面上运行多少查询,最有效的方法是什么

下面是一个示例查询

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));                        
    }
从TableName中选择count(*),其中LType=“A”和(LDate介于2015年10月2日和2015年25月2日之间)
公共操作结果索引(字符串排序器、字符串currentFilter、字符串searchString、int?页)
{
ViewBag.CurrentSort=排序器;
ViewBag.LastNameSortParam=String.IsNullOrEmpty(排序器)?“LastName”:“;
ViewBag.DateSortParam=sortOrder==“日期”?“LeadDate”:“日期”;
if(searchString!=null)
{
page=1;
}
其他的
{
searchString=currentFilter;
}
ViewBag.CurrentFilter=搜索字符串;
var newLeads=从db.WebLeads中的l开始
其中(l.LoanAgent==null | | l.LoanAgent==”hb@mwfinc.com")
选择l;
如果(!String.IsNullOrEmpty(searchString))
{
newLeads=newLeads.Where(l=>l.LastName.Contains(searchString)
||l.FirstName.Contains(searchString));
}
开关(分拣机)
{
案件“日期”:
newLeads=newLeads.OrderBy(l=>l.LeadDate);
打破
案例“交付日期”:
newLeads=newLeads.OrderByDescending(l=>l.LeadDate);
打破
案例“LastName”:
newLeads=newLeads.OrderBy(l=>l.LastName);
打破
违约:
newLeads=newLeads.OrderByDescending(l=>l.LeadDate);
打破
}
int pageSize=15;
整数页码=(第1页);
DateTime minDate=System.DateTime.Today;
DateTime maxDate=System.DateTime.Now;
//要分配每日盘点的潜在客户
var ctPurchTBA=db.WebLeads.Count(x=>(x.LoanType==“自置居所”| | x.LoanType==“CalPATH自置居所”)
&&x.LeadDate>=minDate

&&x.LeadDate正如Osadella在评论中提到的,您可以使用实体框架生成的POCO以一种更理智的方式来实现这一点

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

然而,为了回答您的问题,您可能应该在POCO(由EF中的
DbContext
生成的大数据模型)上使用LINQ,原因很简单,您可以使用它。LINQ是比SQL简单得多的抽象,关于LINQ的好处,有一些相当好的例子

您可以使用基于SQL的LINQ,也可以使用基于方法的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);
var count=db.TableNames.count(x=>x.LType==“A”
&&x.LDate>=minDate

&&x.LDate根据负载/表的大小/总体性能考虑,我将采用两种方法:1.使用select计数(*)的select和sub select进行一次选择作为子选择。您只需要将一个项目传递给vew 2。根据表Load/volume上的不同计划,使用前端异步请求加载总计,以减少sql负载。您能提供方法1的示例吗?不幸的是,我有点新手,所以您的回答有点超出我的理解。因为您使用的是EF/Linq,为什么不使用您的POCO而不是纯sql。类似于var myPoco=YourDBContext.models,然后您可以使用myPoco并按您的喜好查询它例如:
选择tab1.numbers1,tab2.numbers2,tab3.numbers3 from(选择count(*)作为表1中的numbers1)作为tab1,(选择count(*)作为表2中的numbers2)作为tab2,(选择count(*)如表3中的编号3)如表3所示,但请注意,对于SQL server来说,这是一个性能过剩的问题,尤其是当您谈到75个表时。就个人而言,我会使用异步过程,但这是我个人的观点。非常感谢您提供的信息。这可能超出了问题的范围,但我如何将该查询的结果返回给我的view?我在我的控制器中设置了查询。控制器还返回我正在查询计数的同一个表中的分页记录列表。请参见下文。我是否正确设置了该列表,计数查询是否应该在控制器中?我在我的原始帖子中添加了控制器中的代码…如果我能得到一个如何进行分页的示例的话对于视图,我想一切都会安排好的。提前谢谢你!你对视图模型了解多少?我刚从Web表单开始接触MVC。这是我的第一个应用程序。我有两本书,但我一直在为视图传递多个模型而烦恼。我已经为我现有的数据库创建了一个数据库第一个模型。有没有在我上面的例子中,我想做的事情是从一个表中得到的,所以我不是只使用一个模型吗?我最近关于视图模型使用的两个答案是:和