簡體   English   中英

Linq:將1個子集合與(總計)子集合進行比較

[英]Linq : Comparing 1 Child Collection to (Aggregated) ChildCollection(s)

我有一個Linq問題:(DotNet Framework 4.0)

我有以下課程:

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; }
}

在下面的代碼中,我可以比較2個子集合並獲得所需的結果(在“ matches1”中。在這里,我使用“ SSN”字符串屬性進行比較並找到重疊部分。matches1的Console.Write的工作方式如下:我預計。

我不知道該怎么做,就是將第一個孩子集合(org10)與(allOtherOrgsExceptOrg10(所有組織和這些組織的所有鏈接)中的所有孩子進行比較

注釋掉的代碼顯示了我正在嘗試做的事情,這是我今天許多微弱的嘗試之一。

但基本上,match2將填充所有SSN重疊...但是將org10與allOtherOrgsExceptOrg10,所有“鏈接”以及其Employee.SSN進行比較。 org10與帶有“ AAA”的org20重疊,因此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));
                }
            }

您可以使用SelectMany展平集合,然后像使用matchs一樣使用它

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。

matches2 =
            allOtherOrgsExceptOrg10.SelectMany(x => x.Links)
                .Where(x => org10.Links.Select(o => o.TheEmployee.SSN).Contains(x.TheEmployee.SSN));

您可以在allOther集合上使用SelectMany來選擇所有組織中的所有鏈接。 然后檢查org10列表中是否有任何SSN。

請參閱: http : //msdn.microsoft.com/zh-cn/library/system.linq.enumerable.selectmany(v=vs.100).aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM