数据库不用循环更新

时间:2016-04-27 05:42:26

标签: c# asp.net-mvc linq

我必须根据用户输入的百分比将客户分配给不同的员工。例如,我有10个属于salesman3的客户,我为salesman1输入50%,为salesman2输入50%。这意味着其中5个客户转到salesman1,另外5个转到salesman2。我想通过更新数据库中的销售员ID来实现这一点。我已经放入了一些计数器,以确保它输入的百分比和循环遍及整个销售人员列表。它证明它正在运行整个foreach循环并获得百分比,但是当我检查数据库时它只更新一次。这是我的代码。如果我这里没有东西,我很抱歉。我是新用户和初学者编码器。感谢。

public ActionResult Submit(string json, string terminated_id, string total_clients)
{
    int T_ID = Convert.ToInt32(terminated_id);
    int T_clients = Convert.ToInt32(total_clients);
    List<emp_info> list = JsonConvert.DeserializeObject<List<emp_info>>(json);
    int counter = 0;
    foreach (var obj in list)
    {
        counter++;
    }
    int counting = 0;
    string[] array = new string[counter];
    int i = 0;
    foreach (var obj in list)
    {
        counting++;
        array[i] = obj.percent;
        i++;
        if (obj.percent != "")
        {
            int count = Convert.ToInt32((double)T_clients * (Convert.ToDouble(obj.percent) / 100));
            var selected_list = db.Clients.ToList().Take(count);
            var query = from cust in selected_list
                        where cust.Salesperson_ID == T_ID
                        select cust;
            foreach (Client cust in query)
            {
              int int_id =  Convert.ToInt32(obj.ID);
                cust.Salesperson_ID = int_id;
                db.SaveChanges();
            }
            //db.SaveChanges();
            //return View();
        }
    }
    ViewBag.counting = counting;
    ViewBag.percentages = array;
    ViewBag.counter = counter;
    db.SaveChanges();
    return View();
}

2 个答案:

答案 0 :(得分:0)

通过实际获取您想要的内容而不是通用的json和字符串然后转换它们来简化您的API。

  1. 在一次数据库调用中抓取您要更新的所有记录。
  2. 创建一个包含ID和上限的新数组 百分比(汇总)是他们的。 {{名称=&#34;鲍勃&#34;,ID = 1,百分比= 5},{名称=&#34;约翰&#34;,ID = 2,百分比= 10},{名称=&#34; Joe&#34;,ID = 3,percent = 85}}变为{{ID = 1,%= 5},{ID = 2,%= 15},{ID = 3,%= 100}}
  3. 循环遍历数组和 指派正确的销售人员。
  4. 更新数据库。
  5. 像这样:

    public ActionResult Submit(List<emp_info> list, int terminated_id)
    {
      // Grab records to update in one call
      var clients=db.Clients.Where(c=>c.Salesperson_ID==terminated_id).ToList();
      var total=clients.Count();
    
      if (clients.Sum(c=>c.percent)!=100)
        throw new ApplicationException("Percentages must add up to 100%!");
    
      // Create new array with upperbound percent
      var newlist=list
        .Aggregate(new {ID=0,percent=0},(prev,curr)=>new {
          ID=curr.ID,percent=prev.percent+curr.percent
        });
      // Sanity check
      Debug.Assert(newlist.Last().percent==100);
    
      // Loop through records and assign new salesperson
      for(var x=0;x<total;x++)
      {
        clients[x].Salesperson_ID=newlist.Last(l=>l.percent<=x*100/total).ID;
      }
    
      // Send updates to database
      db.SaveChanges();
      ViewBag.counting = total;
      ViewBag.percentages = list.Select(l=>l.percent).ToArray();
      ViewBag.counter = total;
      return View();
    }
    

答案 1 :(得分:0)

您始终使用此db.Clients.ToList().Take(count);计算首次计算客户 试试var selected_list = db.Clients.ToList().Skip((counting-1) * count).Take(count);
(count-1)从0开始,所以在开始时不会有任何跳过客户端,对于下一个员工,你将跳过前5个客户端(在你的情况下)。代码未经过测试,但试一试。我想发表评论,但我没有足够的代表:)