2016-02-11 5 views
0

У меня проблема с фильтрацией записей, возвращаемых с помощью linq. Объекты, участвующие выглядеть следующим образом:Фильтрация дочернего объекта с несколькими критериями

Назначение

public partial class Appointment 
{ 
    public Appointment() 
    { 
     Callbacks = new HashSet<Callback>(); 
    } 

    [Key()] 
    public int AppointmentId { get; set; } 
    public DateTime Start { get; set; } 
    public DateTime? Deleted { get; set;} 

    public virtual ICollection<Callback> Callbacks { get; set; } 
} 

Ответный

public partial class Callback 
{ 
    [Key()] 
    public int CallbackId { get; set; } 
    public DateTime? Deleted { get; set; } 
    public virtual Appointment Appointment { get; set; } 

    public virtual User AssignedTo { get; set; } 
} 

Пользователь

public partial class User 
{ 
    public User() 
    { 
     Callbacks = new HashSet<Callback>(); 
    } 

    [Key()] 
    public int UserId { get; set; } 
    public string LastName { get; set; } 
    public string FirstName { get; set; } 
    public string Ref { get; set; } 

    public virtual ICollection<Callback> Callbacks { get; set; } 
} 

Я пытаюсь вернуться записи, которые удовлетворяют следующим критериям:

  • Дата назначения start должна равняться searchDate
  • Назначение не удаляется
  • Дата назначения start не должны конфликтовать с любыми назначениями, что пользователь уже имеет

Я попытался с помощью следующего запроса, но результаты не возвращаются (есть назначения, доступные для даты 01/03/2016 (dd/mm/yyyy).

public List<AppointmentSearchResultsViewModel> SearchByDate(DateTime searchDate, string userName) 
{ 
    return _context.Appointments 
     .Where(a => 
      a.Start.Date == searchDate 
      && a.Deleted == null 
      && a.Callbacks.Any(c => 
       !(c.Appointment.Start != a.Start 
       && c.AssignedTo.Ref == userName 
       && c.Deleted == null) 
     )) 
     .OrderBy(a => a.Start) 
     .Select(a) 
     .ToList(); 
} 

Помогла ли мне помощь в том, как правильно фильтровать, исходя из критериев выше?

Редактировать

Чтобы попытаться уточнить модель:

  • Пользователь имеет обратные вызовы
    • обратного вызова имеет назначение

Цель этот запрос предназначен для поиска всех назначений на searchDate, где пользователь еще не имеет обратного вызова, запланированного на время встречи.

+0

Ваша модель и ваш код не совпадает. Так что непонятно, что вы просите. Вы пытаетесь отфильтровать обратные вызовы или встречи? Как этот компилятор Linq компилируется? –

+0

Вы говорите: «Дата начала встречи должна быть равна searchDate», а затем вы говорите: «Дата начала назначения не должна конфликтовать с любыми встречами, которые у пользователя уже есть». Как так ? –

+1

@CetinBasoz Значит, что 'searchdate' еще не добавлено ни одному пользователю. – HimBromBeere

ответ

1

Я думаю, что вам нужно отрицательное сравнение для вашего Any -statement:

!a.Callbacks.Any(c => 
    (c.Appointment.Start == a.Start 
    && c.AssignedTo.Ref == userName 
    && c.Deleted == null) 

Таким образом, вы получили только те Callbacks из a.Callbacks, которые имеют различный Start -date.

Furtheremore вы можете опустить Select(a)-заявку в конце и сразу же позвонить ToList.

+0

Извините за поздний ответ и спасибо, это и было сделано. – Gareth

1

модель и то, что вы пытаетесь достичь, не совсем понятно, для меня, но я попробую свои шансы в любом случае на части O мог понять:

return _context.Appointments 
     .Where(a => 
      a.Start.Date == searchDate 
      && a.Deleted == null 
      && !a.Callbacks.Any(c => 
       (c.Appointment.Start == a.Start 
       && c.AssignedTo.Ref == userName 
       && c.Deleted == null) 
    )) 
     .OrderBy(a => a.Start) 
     .ToList(); 
0

Попробуйте это и дайте мне знать, что вы получите взамен ...

return context.Users.Where(user => user.Ref = userName) 
        .SelectMany(user => user.Callbacks) 
        .Where(cb => cb.Appointment.Deleted == null) 
        .Where(cb => cb.Appointment.Start == searchDate) 
        .Select(cb => cb.Appointment) 
        .ToList(); 

Это должно возвратить любые встречи, которые вступают в противоречие с searchDate параметром

+0

Это не будет фильтровать эти обратные вызовы, начало которых НЕ равно одному из текущего объекта (см. «Условие столкновения») – HimBromBeere

+0

@HimBromBeere нет текущей сущности ... По сути, он спрашивает, как узнать, есть ли у пользователя имеет какие-либо назначения на заданную дату или я что-то пропустил –

+0

OP запрашивает ro-встречи на определенную дату, которые еще не были добавлены ни одному пользователю. Думаю, вы пропустите этот последний пункт. Btw: в 'context' нет свойства' Users'. – HimBromBeere

Смежные вопросы