Я пытаюсь написать запрос 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();