как я могу оптимизировать этот foreach - PullRequest
0 голосов
/ 05 апреля 2020
        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;
        }

- это метод, который помещает число в начало даты и фиксирует остальные записи после этой даты. это занимает много времени, чтобы пройти через записи и вызывает много проблем. как я могу оптимизировать это?

1 Ответ

0 голосов
/ 05 апреля 2020

Вы можете попытаться удалить много чтения из базы данных и выполнить все операции в памяти.

Примерно так:

 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...