Можно ли клонировать IQueryable в linq?Для целей UNION? - PullRequest
8 голосов
/ 15 июня 2010

У меня есть таблица WorkOrders.Таблица имеет поле PrimaryWorker & PrimaryPay.Он также имеет поле SecondaryWorker & SecondaryPay (которое может быть null).

Я хочу выполнить 2 очень похожих запроса и объединить их так, чтобы он возвращал поле Worker Field & Pay.Таким образом, если бы в одной записи WorkOrder были заполнены поля PrimaryWorker и SecondaryWorker, я бы получил обратно 2 записи.

Часть "where clause" в этих 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 запроса вместе?

Ответы [ 2 ]

5 голосов
/ 15 июня 2010

Хм, я не уверен, что понимаю ваше намерение. Но я думаю, что клонирование не является необходимым. Почему бы вам не разделить два новых запроса из базового запроса?


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);

После определения ваших запросов вы можете интерпретировать их (для каждого перечисления) и получать различные результаты.

<code>
var res1 = query1.ToList();
var res2 = query2.ToList();
0 голосов
/ 15 июня 2010

Когда вы делаете второе, где вы на самом деле клонируете свой запрос.

Здесь вы создаете исходный запрашиваемый объект.

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);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...