Преобразуйте и оптимизируйте код c# linq в sql с помощью соединения

#c# #sql #join #linq-to-sql

Вопрос:

У меня есть некоторый код в c# linq, и я хочу преобразовать его в соединение(оптимизировать скорость).

пример: 1 — сначала он получает 2 параметра (a.FromDate b.ToDate) 2 — для каждой даты нужно загрузить все коды путей(таблица) 3 — для каждого (пути к дате) я проверяю, существует ли pathrep(таблица) в эту дату, ЕСЛИ она существует, загрузите ее 4. в противном случае загрузите ближайшие пути(таблица) 5. Пути(таблица) и пути(таблица) имеют одинаковые столбцы

 for (var date = startDate; date <= endDate; date = date.AddDays(1))
        {
            IDictionary<string, CPath> paths_dic = new Dictionary<string, CPath>();

            foreach (var path_code_class in db.PathCodes)
            {
                PathRep rep = null;                    

                var db_path_reps = db.PathReps.Where(p => p.path_code == path_code_class.path_code amp;amp; p.rep_start == date );
                if (db_path_reps.Count() > 0)
                {
                    rep = db_path_reps.First();

                    CPath cpath = new CPath();
                    cpath.PathId            =   rep.ID;
                    cpath.PathCode          =   rep.path_code;
                    cpath.PathGroupName     =   rep.path_group_name;
                    ....

                    paths_dic.Add(rep.path_code, cpath);
                }
                else
                {
                    var path = db.Paths.Where(p => p.path_code_id == path_code_class.Id amp;amp; p.start_date <= date ).OrderByDescending(p => p.start_date).First();
                    
                    CPath cpath = new CPath();

                    cpath.PathId            = path.ID;
                    cpath.PathCode          = path.path_code;
                    cpath.PathGroupName     = path.path_group_name;
                    ...

                    paths_dic.Add(path.path_code, cpath);
                }
            }
            dPaths_dic.Add(shamsi_date_int, paths_dic);
        }
 

Этот код очень грязный и не оптимизирован. Я хочу использовать соединение, но мои способы не сработали правильно.

Огромное спасибо

Комментарии:

1. Каков коэффициент успеха поиска записи в повторениях пути? Сколько записей в повторениях пути?

2. для каждой даты и каждого кода пути, возможно, есть представитель пути, если нет, мы должны загрузить ближайший путь

3. Да, я понял эту часть. Я спрашиваю, какой процент у вас на пути? 1% ? 50%? 99%? И сколько записей в таблице повторений пути? 10? 100? Миллион?

4. почти 20% — это повторения пути, все коды путей-400, примерно на каждый день у нас 80 повторений пути. отчет рассчитан на 1 месяц, означает из 12000 записей, 2400-для путей, остальные должны быть извлечены из путей

5. Похоже, что достаточно небольшое количество записей, возможно, имеет смысл загрузить все пути, которые могут применяться (диапазон дат), в словарь, затем вы можете сказать containsKey и знать, нужно ли нажимать db для «ближайшего». Наличие некоторых выборочных данных помогло бы сформировать запросы; я думаю, что для каждого ближайшего можно было бы использовать другой запрос. Все это для максимальной производительности, я думаю, вы могли бы извлечь из этого максимальную пользу, сделав это в виде необработанного sql. Люди в теге sql сделают всю работу, если вы просто опубликуете примеры данных и приведете логику(тег sql немного более странный, чем другие; мы не настаиваем, чтобы люди пробовали сами).