C# MVC-foreach循环中的计数,最佳实践

C# MVC-foreach循环中的计数,最佳实践,c#,asp.net-mvc,foreach,C#,Asp.net Mvc,Foreach,我一直在努力在foreach循环中获取计数记录。我需要在一个页面上运行许多这样的计数。我正在寻找最有效的方法来做到这一点 我已经走了这么远,但我不确定我是否走上了正确的道路。如果是,我如何将这些数据输入到我的视图中 视图模型 public class AgtLeadStatsListVM { public string LoanAgent { get; set; } public DateTime LeadDate { get; set; } public int Lea

我一直在努力在foreach循环中获取计数记录。我需要在一个页面上运行许多这样的计数。我正在寻找最有效的方法来做到这一点

我已经走了这么远,但我不确定我是否走上了正确的道路。如果是,我如何将这些数据输入到我的视图中

视图模型

public class AgtLeadStatsListVM
{
    public string LoanAgent { get; set; }
    public DateTime LeadDate { get; set; }
    public int LeadDailyCt { get; set; }
    public int LeadWeeklyCt { get; set; }
    public int LeadMTDCt { get; set; }
    public int LeadYTDCt { get; set; }
    public IEnumerable<MWFUser> AgentList { get; set; }
    public virtual WebLead Lead { get; set; }
}
公共类AgtLeadStatsListVM
{
公共字符串借词{get;set;}
公共日期时间前置日期{get;set;}
public int leaddaillyct{get;set;}
public int LeadWeeklyCt{get;set;}
public int LeadMTDCt{get;set;}
public int LeadYTDCt{get;set;}
公共IEnumerable代理列表{get;set;}
公共虚拟WebLead{get;set;}
}
控制器

 var model = new AgtLeadStatsListVM();            
 {
 // Get Selected Agent's Information
 var AgentList = from l in db.MWFUsers
                 where (l.UserTitle == "Banker"
                 select l;

    foreach (var agent in AgentList)
    {

    // Daily Lead Count
    var LeadDailyCt = db.WebLeads.Count(x => (x.LoanAgent == agent.UserEmail)
    && (x.LeadDate >= todayDate && x.LeadDate <= todayEndDay));

    // Weekly Lead Count
    var LeadWeeklyCt = db.WebLeads.Count(x => (x.LoanAgent == agent.UserEmail)
                                         && x.LeadDate >= firstOfWeek
                                         && x.LeadDate <= todayEndDay);

    // Monthly Lead Count
    var LeadMTDCount = db.WebLeads.Count(x => (x.LoanAgent == agent.UserEmail)
                                         && x.LeadDate >= firstOfMonth
                                         && x.LeadDate <= todayEndDay);

   // YTD Lead Count
   var LeadYTDCount = db.WebLeads.Count(x => (x.LoanAgent == agent.UserEmail)
                                         && x.LeadDate >= firstOfMonth
                                         && x.LeadDate <= todayEndDay);
}
}
var model=new AgtLeadStatsListVM();
{
//获取所选代理的信息
var AgentList=从db.mwfuser中的l开始
其中(l.UserTitle==“银行家”
选择l;
foreach(代理列表中的var代理)
{
//每日铅含量
var LeadDailyCt=db.WebLeads.Count(x=>(x.LoanAgent==agent.UserEmail)
&&(x.LeadDate>=今天日期和&x.LeadDate(x.LoanAgent==代理.用户电子邮件)
&&x.LeadDate>=星期一
&&x.LeadDate(x.LoanAgent==agent.UserEmail)
&&x.LeadDate>=月初
&&x.LeadDate(x.LoanAgent==agent.UserEmail)
&&x.LeadDate>=月初
&&十、交货日期
我在视图上收到此错误:对象引用未设置为
对象的实例。(第行:@foreach(中的变量项)
模型(代理列表)

AgentList
为空

此外,您还没有正确初始化模型

具体来说,这行代码

var model = new AgtLeadStatsListVM();
创建类型为
AgtLeadStatsListVM
的新对象,其中

  • LoanAgent
    为空
  • LeadDate
    1/1/0001凌晨12:00:00
  • leaddailyt
    为0
  • LeadWeeklyCt
    为0
  • LeadMTDCt
    为0
  • leadydct
    为0
  • AgentList
    为空
  • WebLead
    是Lead
默认值,因为您没有设置任何值。可能您希望使用对象初始值设定项,因此不需要
();
。我们只编写以下内容:

var model = new AgtLeadStatsListVM
{
    LoadAgent = "Name of the LoadAgent",
    LeadDate = DateTime.Now.Utc,
    LeadDailyCt = agents.Sum(a => db.WebLeads.Count(
    x => (x.LoanAgent == a.UserEmail)
        && (x.LeadDate >= todayDate && x.LeadDate <= todayEndDay)))
    // Do the same for the rest of the corresponding properties.
}
var模型=新AgtLeadStatsListVM
{
LoadAgent=“LoadAgent的名称”,
LeadDate=DateTime.Now.Utc,
LeadDailyCt=agents.Sum(a=>db.WebLeads.Count(
x=>(x.LoanAgent==a.UserEmail)
&&(x.LeadDate>=今天日期和x.LeadDate
我在视图上收到此错误:对象引用未设置为
对象的实例。(第行:@foreach(中的变量项)
模型(代理列表)

AgentList
为空

此外,您还没有正确初始化模型

具体来说,这行代码

var model = new AgtLeadStatsListVM();
创建类型为
AgtLeadStatsListVM
的新对象,其中

  • LoanAgent
    为空
  • LeadDate
    1/1/0001凌晨12:00:00
  • leaddailyt
    为0
  • LeadWeeklyCt
    为0
  • LeadMTDCt
    为0
  • leadydct
    为0
  • AgentList
    为空
  • WebLead
    是Lead
默认值,因为您没有设置任何值。可能您希望使用对象初始值设定项,因此不需要
();
。我们只编写以下内容:

var model = new AgtLeadStatsListVM
{
    LoadAgent = "Name of the LoadAgent",
    LeadDate = DateTime.Now.Utc,
    LeadDailyCt = agents.Sum(a => db.WebLeads.Count(
    x => (x.LoanAgent == a.UserEmail)
        && (x.LeadDate >= todayDate && x.LeadDate <= todayEndDay)))
    // Do the same for the rest of the corresponding properties.
}
var模型=新AgtLeadStatsListVM
{
LoadAgent=“LoadAgent的名称”,
LeadDate=DateTime.Now.Utc,
LeadDailyCt=agents.Sum(a=>db.WebLeads.Count(
x=>(x.LoanAgent==a.UserEmail)

&&(x.LeadDate>=todayDate&&x.LeadDatevar model=new AgtLeadStatsListVM();
结尾的分号意味着您在该行之后不再处于对象初始值设定项中。您可能尝试使用的语法与此类似:

var agents = 
    from l in db.MWFUsers
    where l.UserTitle == "Banker"
    select l;

var model = new AgtLeadStatsListVM
{
    // Get Selected Agent's Information
    AgentList = agents.ToList(),
    // Daily Lead Count
    LeadDailyCt = agents.Sum(a => db.WebLeads.Count(
        x => (x.LoanAgent == a.UserEmail)
            && (x.LeadDate >= todayDate && x.LeadDate <= todayEndDay)))
    // ...
}
更新 从你的评论来看,这听起来更像是你想要的:

var model = 
    (from agent in agents
    let webLeads = db.WebLeads.Where(x => x.LoanAgent == agent.UserEmail)
    select new AgtLeadStatsListVM
    {
        // Get Selected Agent's Information
        LoanAgent = agent.UserEmail,
        // Daily Lead Count
        LeadDailyCt = webLeads.Count(x => x.LeadDate >= todayDate && x.LeadDate <= todayEndDay),
        // ...
    }).ToList();
var模型=
(从代理人到代理人)
让webLeads=db.webLeads.Where(x=>x.LoanAgent==agent.UserEmail)
选择新AgtLeadStatsListVM
{
//获取所选代理的信息
LoanAgent=agent.UserEmail,
//每日铅含量

leaddailyt=webLeads.Count(x=>x.LeadDate>=todayDate&&x.LeadDatevar model=new AgtLeadStatsListVM();
结尾的分号意味着在该行之后您不再是对象初始值设定项中的一员。您可能尝试使用的语法更接近以下几行:

var agents = 
    from l in db.MWFUsers
    where l.UserTitle == "Banker"
    select l;

var model = new AgtLeadStatsListVM
{
    // Get Selected Agent's Information
    AgentList = agents.ToList(),
    // Daily Lead Count
    LeadDailyCt = agents.Sum(a => db.WebLeads.Count(
        x => (x.LoanAgent == a.UserEmail)
            && (x.LeadDate >= todayDate && x.LeadDate <= todayEndDay)))
    // ...
}
更新 从你的评论来看,这听起来更像是你想要的:

var model = 
    (from agent in agents
    let webLeads = db.WebLeads.Where(x => x.LoanAgent == agent.UserEmail)
    select new AgtLeadStatsListVM
    {
        // Get Selected Agent's Information
        LoanAgent = agent.UserEmail,
        // Daily Lead Count
        LeadDailyCt = webLeads.Count(x => x.LeadDate >= todayDate && x.LeadDate <= todayEndDay),
        // ...
    }).ToList();
var模型=
(从代理人到代理人)
让webLeads=db.webLeads.Where(x=>x.LoanAgent==agent.UserEmail)
选择新AgtLeadStatsListVM
{
//获取所选代理的信息
LoanAgent=agent.UserEmail,
//每日铅含量

LeadDailyCt=webLeads.Count(x=>x.LeadDate>=todayDate&&x.LeadDate我将忽略您得到的错误(请参见其他答案),仅参考最佳实践和计算部分问题的最有效方法

最有效的方法(至少在我看来)是对结果使用一些缓存技术,并每天更新缓存(因为您使用的最大分辨率是每天)。显然,选择合适的缓存机制取决于您的应用程序。它可以从在应用程序启动时将一些数据存储在静态变量中,到运行专用(或任何其他快速数据结构存储)。这里的底线是:尽量减少对DB的查询数量并缓存任何合适的数据。

I