2012-05-31 3 views
0

я Contact запроса, который содержит Communication подзапроса, который содержит CommunicationExtension подзапросаКак фильтровать дерево IQueryable?

static class Program 
    { 
     public class Contact 
     { 
      public int ContactID { get; set; } 
      public List<Communication> Communications { get; set; } 
      public DateTime? DeletionDate { get; set; } 
     } 

     public class Communication 
     { 
      public int CommuncationID { get; set; } 
      public List<CommunicationExtension> CommunicationExtensions { get; set; } 
      public DateTime? DeletionDate { get; set; } 
     } 

     public class CommunicationExtension 
     { 
      public int CommunicationExtensionID { get; set; } 
      public int AreaCode { get; set; } 
      public DateTime? DeletionDate { get; set; } 
     } 

     static void Main(string[] args) 
     { 
      IQueryable<Contact> q = GenerateData(); 
      IQueryable<Contact> result = 
       q.Where(c => c.DeletionDate == null && 
        c.Communications.Where(co => co.DeletionDate == null && 
         co.CommunicationExtensions.Where(ce => ce.DeletionDate == null)); 
     } 



     private static IQueryable<Contact> GenerateData() 
     { 
      return new List<Contact> 
         { 
          new Contact 
           { 
            ContactID = 1, 
            DeletionDate = DateTime.Now, 
            Communications = 
             new List<Communication> 
              { 
               new Communication 
                { 
                 CommuncationID = 1, 
                 DeletionDate = DateTime.Now, 
                 CommunicationExtensions = 
                 new List<CommunicationExtension> 
                  { 
                   new CommunicationExtension 
                    { 
                     CommunicationExtensionID = 1, 
                     AreaCode = 5, 
                     DeletionDate = null 
                    } 
                  } 
                }, 
               new Communication 
                { 
                 CommuncationID = 2, 
                 DeletionDate = null, 
                 CommunicationExtensions = 
                 new List<CommunicationExtension> 
                  { 
                   new CommunicationExtension 
                    { 
                     CommunicationExtensionID = 2, 
                     AreaCode = 55, 
                     DeletionDate = DateTime.Now 
                    } 
                  } 
                } 
              } 
           }, 
          new Contact 
           { 
            ContactID = 2, 
            DeletionDate = null, 
            Communications = 
             new List<Communication> 
              { 
               new Communication 
                { 
                 CommuncationID = 1, 
                 DeletionDate = null, 
                 CommunicationExtensions = 
                 new List<CommunicationExtension> 
                  { 
                   new CommunicationExtension 
                    { 
                     CommunicationExtensionID = 3, 
                     AreaCode = 54, 
                     DeletionDate = null 
                    } 
                  } 
                }, 
               new Communication 
                { 
                 CommuncationID = 2, 
                 DeletionDate = DateTime.Now, 
                 CommunicationExtensions = 
                 new List<CommunicationExtension> 
                  { 
                   new CommunicationExtension 
                    { 
                     CommunicationExtensionID = 4, 
                     AreaCode = 5565, 
                     DeletionDate = null 
                    } 
                  } 
                } 
              } 
           } 
         }.AsQueryable(); 
     } 
    } 

Когда я пытаюсь построить его, я получаю сообщение об ошибке:

Оператор «& &» не может быть применен к операнды типа 'BOOL' и 'System.Collections.Generic.IEnumerable'

на линии:

IQueryable<Contact> result = 
       q.Where(c => c.DeletionDate == null && 
        c.Communications.Where(co => co.DeletionDate == null && 
         co.CommunicationExtensions.Where(ce => ce.DeletionDate == null))); 

Мне нужно отфильтровать все данные, которые не удалены (DeletionDate == null). В моем сценарии есть ~ 200 таблиц в базе данных, каждая таблица содержит обнуляемого поле DeletionDate

ответ

1

Вот проблема:

c.Communications.Where(co => co.DeletionDate == null && 
    co.CommunicationExtensions.Where(ce => ce.DeletionDate == null) 

Эти две строки не возвращают логическое значение, так что ваш Where вызов не знает Что с этим делать. Вам нужен какой-либо Контакт, у которого есть хотя бы один неиспользуемый Communications и CommuincationExtensions? Если это так, то смените Where звонки на номер Any, и он должен работать. Однако имейте в виду, что при работе с вашим Contacts вам все равно придется отфильтровывать любые удаленные /CommunicationExtensions, так как отношения свяжут вас с соответствующими записями. Другими словами, contact.Communications вернет все Communications, связанные с этим Contact, и comm.CommunicationExtensions вернет все CommunicationExtensions, поэтому вам все равно придется отфильтровывать любые удаленные записи всякий раз, когда вы с ними справляетесь.

+0

Я хочу, чтобы все 'Contacts'' Communications' и' CommunicationExtensions' не удалялись. Такие связанные таблицы могут быть намного больше, чем в этом примере. И мне нужно написать это в нескольких 'Where()'. Я не могу использовать 'ToList()', потому что он будет загружать все ненужные данные. Позже эти данные привязаны к тому, чтобы просмотреть брошенный один «Контакт». Дополнительные данные загружаются, когда это необходимо для просмотра из «Коммуникации» или «Коммуникационные расширения». –

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