2014-09-10 125 views
0

我有一个LINQ的问题:(DOTNET的框架4.0)的Linq:1儿童系列相较于(聚合)ChildCollection(S)

我有以下类别:

public class Employee 
{ 
    public Guid? EmployeeUUID { get; set; } 
    public string SSN { get; set; } 
} 

public class JobTitle 
{ 
    public Guid? JobTitleSurrogateKey { get; set; } 
    public string JobTitleName { get; set; } 
} 


public class EmployeeToJobTitleMatchLink 
{ 
    public EmployeeToJobTitleMatchLink() 
    { 
     this.TheJobTitle = new JobTitle() { JobTitleSurrogateKey = Guid.NewGuid(), JobTitleName = "SomeJobTitle:" + Guid.NewGuid().ToString("N") }; 
    } 
    public Guid LinkSurrogateKey { get; set; } 
    /* Related Objects */ 
    public Employee TheEmployee { get; set; } 
    public JobTitle TheJobTitle { get; set; } 
} 


public class Organization 
{ 
    public Organization() 
    { 
     this.Links = new List<EmployeeToJobTitleMatchLink>(); 
    } 

    public int OrganizationSurrogateKey { get; set; } 

    public ICollection<EmployeeToJobTitleMatchLink> Links { get; set; } 
} 

在我下面的代码,我可以比较两个孩子集合并获得我需要的结果(在“matches1”中) 这里我使用“SSN”字符串属性来比较并找到重叠部分,并且Match1的Console.Write按我期望的那样工作

我不知道该怎么做是比较第一个气ld collection(org10)给allOtherOrgsExceptOrg10(所有组织和这些组织的所有链接)中的所有孩子

注释掉的代码显示了我正在尝试做的事情,这是我今天的许多微弱尝试之一。

但基本上,match2将填充所有的SSN重叠...但比较org10与allOtherOrgsExceptOrg10,所有他们的“链接”,以及他们的Employee.SSN。 org10与org20与“AAA”重叠,因此match2将包含“AAA”。 org10与org30与“BBB”重叠,因此match2将包含“BBB”。

  Organization org10 = new Organization(); 
      org10.OrganizationSurrogateKey = 10; 

      Employee e11 = new Employee() { SSN = "AAA", EmployeeUUID = new Guid("AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA") }; 
      EmployeeToJobTitleMatchLink link11 = new EmployeeToJobTitleMatchLink(); 
      link11.TheEmployee = e11; 

      org10.Links.Add(link11); 

      Employee e12 = new Employee() { SSN = "BBB", EmployeeUUID = new Guid("BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB") }; 
      EmployeeToJobTitleMatchLink link12 = new EmployeeToJobTitleMatchLink(); 
      link12.TheEmployee = e12; 

      org10.Links.Add(link12); 



      Organization org20 = new Organization(); 
      org20.OrganizationSurrogateKey = 20; 

      Employee e21 = new Employee() { SSN = "AAA", EmployeeUUID = new Guid("AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA") }; 
      EmployeeToJobTitleMatchLink link21 = new EmployeeToJobTitleMatchLink(); 
      link21.TheEmployee = e21; 

      org20.Links.Add(link21); 

      Employee e22 = new Employee() { SSN = "CCC", EmployeeUUID = new Guid("CCCCCCCC-CCCC-CCCC-CCCC-CCCCCCCCCCCC") }; 
      EmployeeToJobTitleMatchLink link22 = new EmployeeToJobTitleMatchLink(); 
      link22.TheEmployee = e22; 

      org20.Links.Add(link22); 



      Organization org30 = new Organization(); 
      org30.OrganizationSurrogateKey = 30; 

      Employee e31 = new Employee() { SSN = "BBB", EmployeeUUID = new Guid("BBBBBBBB-BBBB-BBBB-BBBB-BBBBBBBBBBBB") }; 
      EmployeeToJobTitleMatchLink link31 = new EmployeeToJobTitleMatchLink(); 
      link31.TheEmployee = e31; 

      org30.Links.Add(link31); 

      Employee e32 = new Employee(); 
      e32.SSN = "ZZZ"; 
      EmployeeToJobTitleMatchLink link32 = new EmployeeToJobTitleMatchLink(); 
      link32.TheEmployee = e32; 

      org30.Links.Add(link32); 


      IList<Organization> allOtherOrgsExceptOrg10 = new List<Organization>(); 

      /* Note, I did not add org10 here */ 
      allOtherOrgsExceptOrg10.Add(org20); 
      allOtherOrgsExceptOrg10.Add(org30); 


      IEnumerable<EmployeeToJobTitleMatchLink> matches1 = 
      org10.Links.Where(org10Link => org20.Links.Any(org20Link => org20Link.TheEmployee.SSN.Equals(org10Link.TheEmployee.SSN, StringComparison.OrdinalIgnoreCase))); 


      IEnumerable<EmployeeToJobTitleMatchLink> matches2 = null; 
      //org10.Links.Where(org10Link => (allOtherOrgs.Where (anyOtherOrg => anyOtherOrg.Links.Any(dbSideChild => dbSideChild.TheEmployee.SSN == org10Link.TheEmployee.SSN))); 


      if (null != matches1) 
      { 
       foreach (EmployeeToJobTitleMatchLink link in matches1) 
       { 
        Console.WriteLine(string.Format("matches1, SSN = {0}", link.TheEmployee.SSN)); 
       } 
      } 

      if (null != matches2) 
      { 
       foreach (EmployeeToJobTitleMatchLink link in matches2) 
       { 
        Console.WriteLine(string.Format("matches2, SSN = {0}", link.TheEmployee.SSN)); 
       } 
      } 

回答

1

可以使用的SelectMany变平的集合,然后使用它,就像你有matches1

IEnumerable<EmployeeToJobTitleMatchLink> matches2 = 
      org10.Links.Where(
       org10Link => 
       allOtherOrgsExceptOrg10.SelectMany(allOtherOrgs => allOtherOrgs.Links).Any(
        anyOtherLink => 
        anyOtherLink.TheEmployee.SSN.Equals(org10Link.TheEmployee.SSN, StringComparison.OrdinalIgnoreCase))); 

的的SelectMany将使它看起来像一个IEnumerable的,而不是和IEnumerable IEnumerable的。