Linq с условием дела в той же таблице и счет из другой таблицы, где условие - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь написать запрос linq в следующих ситуациях.Я пытаюсь получить Guids там, где нет отправленных сообщений.

У меня есть 3 таблицы

TableTarget TargetGuid |FrequencyID 1234 |1 0987 |2

Частота таблицы FrequencyID|FrequencyTypeID |Time1|Time2 1 |2 |8 AM | 12 PM 2 |1 |2 PM |null

TableSentHistory

Эта таблица обновляется после целиотправлено.

TargetGuid|SentTime 1234 |2019-04-04 08:05:06 1234 |2019-04-04 12:05:06 0987 |2019-04-04 02:05:06

Теперь я хочу вытащить данные, где time1 или time2> текущее время, и считать из таблицы Tablesenthistory для текущей даты должно быть меньше 2, если частота равна 1 в частотетаблица и количество <3, если частота равна 2 в таблице частот.Прямо сейчас я извлекаю все данные из таблицы целей и частот и работаю в памяти.Это вызывает у меня проблемы с производительностью, потому что я вытягиваю все направляющие и проверяю, соответствуют ли условия. </p>

Есть ли способ получить только те, которые не отправлены сегодня, проверяя отправленную историю.

Я также сталкиваюсь с проблемой состояния гонки при работе на нескольких серверах.Это мой запрос linq.

     var targets = (from dt in _context.Target
                              join df in context.Frequency on dt.FrequencyId equals df.FrequencyId                                  
                              where df.Time1.TimeOfDay < DateTime.UtcNow.TimeOfDay
                                    || (df.Time2.TimeOfDay < DateTime.UtcNow.TimeOfDay
                                        && df.Time2 != System.Data.SqlTypes.SqlDateTime.MinValue.Value.ToUniversalTime())
                              select new Processing
                              {
                                 TargetGuid = dt.TargetGUID,
                                  Time1 = df.Time1,
                                  Time2 = df.Time2,
                                  FrequencyType = (FrequencyType)df.FrequencyTypeId
                              }).ToList();

Я также попытался добавить третье объединение таблиц, но не смог получить сравнение по количеству и случаю.

Я попробовал это после того, как решение опубликовано, но я получаю эту ошибку.Обнуляемый объект должен иметь значение.

var history = (from ds in context.ServiceHistory
                           where ds.SentTime.Date == DateTime.UtcNow.Date
                           group ds by ds.TargetGuid into grp
                           select new
                           {
                               TargetGuid = grp.Key,
                               Count = grp.Count()
                           }).ToList();

            var Targets = (
                            from dt in context.Target
                            join df in context.Frequency
                            on dt.FrequencyId equals df.FrequencyId
                            join h in history on dt.TargetGUID equals h.TargetGuid into hist
                            from h in hist.DefaultIfEmpty()
                            where df.Time1.TimeOfDay < DateTime.UtcNow.TimeOfDay
                                                    || (df.Time2.TimeOfDay < DateTime.UtcNow.TimeOfDay
                                                        && df.Time2 != System.Data.SqlTypes.SqlDateTime.MinValue.Value.ToUniversalTime())                                
                            && h.Count < (df.FrequencyTypeId == (int)FrequencyType.Daily ? 2 : 3)
                            select new
                            {
                                dt.TargetGUID,
                                df.FrequencyTypeId
                            }).ToList();

1 Ответ

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

Попробуйте это:

var targets = (
    from dt in _context.Target
    join df in context.Frequency 
    on dt.FrequencyId equals df.FrequencyId                                  
    where df.Time1.TimeOfDay < DateTime.UtcNow.TimeOfDay
    || (df.Time2 != null && df.Time2.TimeOfDay < DateTime.UtcNow.TimeOfDay)
    join h in context.SentHistory.Where(hh => hh.SentTime < DateTime.UtcNow.Date)
    on dt.TargetGuid equals h.TargetGuid into history
    where history.Count() < (df.Time2 == null ? 2 : 3)
    select new Processing {
        TargetGuid = dt.TargetGUID,
        Time1 = df.Time1,
        Time2 = df.Time2,
        FrequencyType = (FrequencyType)df.FrequencyTypeId
    }).ToList();
...