Я могу клонировать IQueryable в linq? В целях ОБЪЕДИНЕНИЯ?

У меня есть таблица 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 запроса вместе?

9
задан mipe34 22 February 2013 в 11:37
поделиться

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();
7
ответ дан 4 December 2019 в 22:27
поделиться

Когда вы выполняете вторую строку 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);

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

1
ответ дан 4 December 2019 в 22:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: