繁体   English   中英

我怎样才能优化这个foreach

[英]how can I Optimize this foreach

        public int SetNumber(FinancialEntities db, bool Redirected = false)
        {
            db = new FinancialEntities();
            List<Document> ds = db.Documents.Where(d => DbFunctions.TruncateTime(d.Date) > DbFunctions.TruncateTime(Date) && d.UnitID == UnitID).ToList();
            ds.Remove(this);
            ds = ds.OrderBy(d => d.Date).ToList();
            if (ds.Count > 0)
            {
                Number = ds.FirstOrDefault().Number;
                int tn = (int)Number;
                foreach (var item in ds)
                {
                    tn++;
                    if (item.Number != tn)
                    {
                        item.Number = tn;
                        db.Entry(item).State = System.Data.Entity.EntityState.Modified;
                    }
                }
                db.SaveChanges();
            }
            else
            {
                Number = db.Documents.Where(d => d.UnitID == UnitID).Count() > 0 ? db.Documents.Where(d => d.UnitID == UnitID).Max(d => d.Number) + 1 : 1;
            }
            List<int?> nums = db.Documents.Where(d => d.UnitID == UnitID).Select(d => d.Number).ToList();
            int nc = nums.Count();
            int ndc = nums.Distinct().Count();
            if (nums.Distinct().Count() != nums.Count() && Redirected == false)
            {
                if (ds.Count() == 0)
                    ds = db.Documents.Where(d => d.UnitID == UnitID).ToList();
                ds.First().SetNumber(db, true);
            }
            return (int)Number;
        }

这是一种将数字放在日期开头并修复该日期之后条目的 rest 的方法。 遍历条目需要很长时间,并导致很多问题。 我该如何优化呢?

您可以尝试从 DB 中删除大量读取并在 memory 中执行所有操作。

像这样的东西:

 public int SetNumber(FinancialEntities db, bool Redirected = false)
    {
        db = new FinancialEntities();
        var docs = db.Documents.Where(d => d.UnitID == UnitID).ToList();
        var ds = docs.Where(d => d.Date > Date).ToList();
        ds.Remove(this);
        ds = ds.OrderBy(d => d.Date).ToList();
        if (ds.Count > 0)
        {
            Number = ds.FirstOrDefault().Number;
            int tn = (int)Number;
            foreach (var item in ds)
            {
                tn++;
                if (item.Number != tn)
                {
                    item.Number = tn;
                    db.Entry(item).State = System.Data.Entity.EntityState.Modified;
                }
            }
            db.SaveChanges();
        }
        else
        {
            Number = docs.Count > 0 ? docs.Max(d => d.Number) + 1 : 1;
        }

        List<int?> nums = docs.Select(d => d.Number).ToList();
        int nc = nums.Count;
        int ndc = nums.Distinct().Count();
        if (ndc != nc && Redirected == false)
        {
            if (ds.Count == 0)
                ds = docs.ToList();
            ds.First().SetNumber(db, true);
        }
        return (int)Number;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM