У меня есть база данных SQL, размещенная в Azure вместе с моим веб-приложением (как в том же центре обработки данных).Условный оператор IF в операторе LINQ
У меня есть несколько похожих запросов LINQ, которые в основном отличаются только предложением .
Поскольку запросы похожи, я не хочу, чтобы у меня было перекодирование кода в любом месте, но я не знаю LINQ позволяет мне иметь условные IFs в операторах.
Я добавил фрагмент кода ниже, поэтому любые указатели на это были бы полезны. Я должен также упомянуть, что он запрашивает представление, а не таблицу.
case Constants.OPENED:
lstQueryEvents = db.tblEmailEvents
.Where(t => t.strType.ToUpper() == Constants.OPENED_TYPE)
.Where(t => t.tblSentEmail.UserID == UserId)
.Where(t => t.tblSentEmail.blnOutlookRec == true || t.tblSentEmail.tblMerges.blnOutlookRec == true)
.Where(s => s.tblSentEmail.tblRecipients.Any(o => o.strEmailAddress.Contains(strSearch)) || s.tblSentEmail.strSubject.Contains(strSearch) || s.tblSentEmail.tblRecipients.Any(r => r.strDisplayName.Contains(strSearch)))
.OrderByDescending(t => t.dtmEvent)
.Take(intNumRecords)
.ToList();
break;
case Constants.CLICKED:
lstQueryEvents = db.tblEmailEvents
.Where(t => t.strType.ToUpper() == Constants.CLICKED_TYPE)
.Where(t => t.tblSentEmail.UserID == UserId)
.Where(t => t.tblSentEmail.blnOutlookRec == true || t.tblSentEmail.tblMerges.blnOutlookRec == true)
.Where(s => s.tblSentEmail.tblRecipients.Any(o => o.strEmailAddress.Contains(strSearch)) || s.tblSentEmail.strSubject.Contains(strSearch) || s.tblSentEmail.tblRecipients.Any(r => r.strDisplayName.Contains(strSearch)))
.OrderByDescending(t => t.dtmEvent)
.Take(intNumRecords)
.ToList();
break;
Может ли 'Constants.OPENED' и' Constants.OPENED_TYPE' быть сделано то же самое (перечисление?)? То же самое для clicked, clicked_type. Тогда что бы вы ни переключали, это то, что вам нужно в предложении where. Или напишите метод с параметром, который входит в предложение where. DRY. –
@BenKnoble 'Constants.OPENED' и' Constants.OPENED_TYPE' не являются перечислениями, но они являются просто закодированными значениями (т.е. 'Constants.OPENED' является строковым литералом' OPENED' и 'Constants.OPENED_TYPE' является string literal 'O'. Что я могу сделать? –
Ну, если они одинаковые, то вместо того, чтобы делать« switch (someValue) case blah: break; case otherblah: break; », то вы можете сделать' query = source .Where (t => t.strType.ToUpper() == someValue) ... 'См. Мощность? –