我正在创建我的第一个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;
答案 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);
显然,您还需要在某处定义minDate
和maxDate
。