Записи запросов LINQ на основе массива дат - PullRequest
2 голосов
/ 28 сентября 2011

У меня есть таблица (я использую Entity Model) и отфильтровал эту таблицу с помощью LINQ-запроса, который работает нормально. Теперь я хочу отфильтровать записи на основе массива дат. Я не могу реализовать предложение IN для массива дат

filteredList = leadsNewAndScheduled.Where(lead =>  
              (LeadTypeIDs.Contains(lead.TYPE_ID.ToString()) ||
              LeadTypeIDs == string.Empty) &&
              (priorityIDs.Contains(lead.PRIORITY_ID.ToString()) ||
              priorityIDs == string.Empty) &&
              (((lead.EXPIRED_ON <= dateExpiry ||
              Convert.ToDateTime(lead.EXPIRED_ON) == DateTime.Today.Date) &&
              lead.STATUS_ID == (int)Enumerations.LeadStatus.New) ||
              lead.STATUS_ID == (int)Enumerations.LeadStatus.Active) &&
              (lead.START_TIME IN (arrAppointmentDates))
            ).ToList();

Я хочу вашей помощи в следующих

(lead.START_TIME IN (arrAppointmentDates))

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 28 сентября 2011

Использование Predicate Builder

Напишите ваш запрос без условия даты, например

var query = leadsNewAndScheduled.Where(lead =>  
              (LeadTypeIDs.Contains(lead.TYPE_ID.ToString()) ||
              LeadTypeIDs == string.Empty) && ....

Затем напишите

  var predicate = PredicateBuilder.False<Lead>();

  foreach (DateTime date in dates)
  {
    DateTime temp = date;
    predicate = predicate.Or (p => p.START_TIME == temp);
  }

  var result = query.Where(predicate).ToList(); // Don't call ToList() earlier

Однако обратите внимание, чтоесли вы используете Entity Framework, вам нужно вызвать AsExpandable () для набора сущностей, прежде чем применять к нему предикаты, например:

return objectContext.Products.AsExpandable().Where (predicate);
1 голос
/ 12 октября 2011

Я решил эту проблему, объявив список дат, а затем применив предложение в запросе LINQ.

пример:

//list of dates.
List<DateTime> arrAppointmentDates;

//change in query
arrAppointmentDates.Contains(Convert.ToDateTime(lead.START_TIME).Date)
...