У меня есть таблица WorkOrders
. Таблица имеет a PrimaryWorker
& PrimaryPay
поле. Это также имеет a SecondaryWorker
& SecondaryPay
поле (который может быть null
).
Я хочу выполнить 2 очень похожих запроса и объединение их так, чтобы оно возвратило a Worker
Поле и Pay
поле. Таким образом, если сингл WorkOrder
запись имела обоих PrimaryWorker
и SecondaryWorker
поле заполнило, я верну 2 записи.
"Где пункт" часть этих 2 запросов очень похож и длинен для построения. Вот фиктивный пример
var q = ctx.WorkOrder.Where(w => w.WorkDate >= StartDt && w.WorkDate <= EndDt);
if(showApprovedOnly)
{
q = q.Where(w => w.IsApproved);
}
//...more filters applied
Теперь мне также назвали поисковый флаг hideZeroPay
. Если это правда я не хочу включать запись, если рабочему заплатили 0$. Но очевидно для 1 запроса я должен выдержать сравнение PrimaryPay
поле и в другом я должен выдержать сравнение SecondaryPay
поле.
Таким образом, я задаюсь вопросом, как сделать это.
Я могу клонировать свой основной запрос q
и сделайте основной и вторичный запрос рабочего из него и затем объединение те 2 запроса вместе?
Хм, я не уверен, что понял ваше намерение. Но я думаю, что клонирование не является необходимым. Почему бы вам не разделить два новых запроса из вашего базового запроса?
var baseQuery = ctx.WorkOrder.Where(w => w.WorkDate >= StartDt && w.WorkDate <= EndDt);
IQueryable<WorkOrder> query1;
if (showApprovedOnly)
{
query1 = baseQuery.Where(w => w.IsApproved);
}
//more filters on query1
...
IQueryable<WorkOrder> query2;
if (/*something*/)
query2 = baseQuery.Where(w => w.SomeThing);
После определения ваших запросов вы можете интерпретировать их (по перечислению) и получить различные результаты.
var res1 = query1.ToList();
var res2 = query2.ToList();
Когда вы выполняете вторую строку Where, вы фактически клонируете свой запрос.
Здесь вы создаете свой исходный запрашиваемый объект.
var q = ctx.WorkOrder.Where(w => w.WorkDate >= StartDt && w.WorkDate <= EndDt);
Здесь вы создаете новый запрашиваемый объект со связанным
if(showApprovedOnly)
{
q = q.Where(w => w.IsApproved);
}
//...more filters applied
Все, что вам нужно сделать, это создать новую переменную для хранения измененного запроса.
var qw = q.Where(w=> w.IsApproved);
Это работает, потому что запрашиваемый объект создается как объект, а сам запрос выполняется только после его перечисления.