2012-05-31 55 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(); 
     } 
    } 

当我尝试构建它,我得到的错误:

操作“& &”不能应用于类型 '布尔' 和 '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不知道如何处理它。您是否想要至少有一个未删除的联系人CommunicationsCommuincationExtensions?如果是这样,那么将Where调用更改为Any,它应该工作。但是,请注意,在实际处理您的Contacts时,您仍然需要过滤掉任何已删除的Communications/CommunicationExtensions,因为无论如何,关系只会为您提供相关记录。换句话说,contact.Communications将返回与Contact相关的所有Communications,而comm.CommunicationExtensions将返回所有CommunicationExtensions,因此,无论何时处理它们,您仍然需要过滤掉任何已删除的记录。

+0

我希望所有'联系人''通信'和'通信扩展'不被删除。在这个例子中,这样的相关表格可能远远超过3个。我需要在多个Where()中写这个。我不能使用'ToList()',因为它会加载所有不必要的数据。稍后,这些数据被绑定到查看单个“联系人”。当查看需要来自“Communication”或“CommunicationExtensions”时,会加载更多数据。 –