选择重复对象的所有数据

时间:2019-02-26 06:05:28

标签: c# linq

我有一个名为Companies的公司列表,里面有重复的公司。 另一个列表relationRepo保留了companiespersons之间的所有关系。 我需要Companies内部的公司的所有关系。

var relations = relationRepo.Where(x => Companies.Any(y => x.QId == y.QId));

返回公司的关系,但不返回重复的关系。换句话说,对于重复的公司,此查询一次返回关系。例如,Company ACompanies中存在两次,并且Company ArelationRepo有3种关系。 在上面运行查询后,relationsCompany A中有3个关系,但我需要6个关系。 有帮助吗?

2 个答案:

答案 0 :(得分:4)

您需要一个联接查询以获取所需的内容。以下应该起作用:

<button id="question-insert-btn"></button>

现在这将在两个var relations = (from relation in relationRepo join company in Companies on relation.QId equals company.QId select relation).ToList(); 中提供匹配的项目。上面的查询所做的是QIdCompanies的匹配行,因此在您的情况下,如果QId有6个项目,而CompaniesQId中匹配,将在relationRepo中为您提供6行。

答案 1 :(得分:0)

因此,您有Companies,并且每个Company都有零个或多个Relations。每个Relation都使用外键Company恰好属于一个CompanyId

您的要求有点不清楚:

  

我需要公司内部所有公司的关系。

不清楚您想要什么。

Company (1) with Name "Acme" has Relations A, B, C 
Company (2) with Name "Acme" has Relations C, X, Y
Company (3) with Name "Other" has Relations D, E,
Company (4) with Name "Other" has Relations D, F,

公司序列中所有公司的所有关系为A B C D E XY。换句话说:任何公司使用的所有关系。 根据您的示例,这不是您想要的。

您还写道:

  

我有一个公司序列,里面有重复的公司。

显然,您可以使用一种方法来确定两个公司是否实际上是同一公司。这可能是按名称,税号或其他方式。如何确定两个公司是否相同与这个问题无关。假设您有一个实现IEqualityComparer<Company>的类的对象:

IEqualityComparer<Company> comparer = ...;

返回您的要求。

我想您是想说要Companies和他们的Relations。如果两家公司实际上是同一家公司,那么您希望它们作为一家“具有关联关系的公司”退回。

因此在上面的示例中,您想要以下结果

  • 具有A B C X Y关系的名称为“ Acme”的公司
  • 名称为“ Other”且关系为D E F的公司

此要求的问题是,如果您认为两家公司相等(例如,因为它们的名称相同),那么您希望拥有不同的Company属性吗?例如:对于名称为“ Acme”的公司应使用什么ID?

几种解决方案:

  • 这不是问题,只有所有属性都相等时,两家公司才是平等的
  • 这不是问题,我不需要任何公司财产
  • 这不是问题,我只希望公司属性相等。例如,我想要名称,而不想要ID
  • 我不在乎您选择哪个平等的公司

由于要求不完整,答案必须非常笼统。所有答案将执行以下操作:

  • 查找所有“有关系的公司”
  • 按平等公司分组
  • 选择所需的公司部分和关系部分。

上述四种可能的要求之间的差异是您最终选择的公司零件。

我将给出最可能的要求的解决方案:

  • 两个拥有相同名称的公司是平等的。
  • 请给我所有与他们有联系的公司的名称

// "I have a List of companies and a List of their Relations"
IEnumerable<Company> companies = ...
IEnumerable<Relation> relations = ...

// I want all Companies with their Relations
var result = companies.GroupJoin(relations,  // GroupJoin Companies and Relations
    company => company.Id,                   // from each Company take the primary key
    relation => relation.CompanyId,          // from each Relation take the foreign key

    // and all Relations with matching foreign key
    (company, relationsOfThisCompany) => new
    {
        Company = company,
        Relations = relationsOfThisCompany,
    })
    // Result: a sequence of companies, each with their Relations

    .GroupBy(
       // KeySelector: make groups of companies with same Name
       joinResult => joinResult.Company.Name,


    // ResultSelector: take the Key (which is the common Name)
    // with all joinResults of companies with name equal equal to the Key to create the output
    (companyName, companiesWithThisName => new
    {
        Name = key.Name,
        Relations = companiesWithThisName.Select(company => company.Relations),
    },

    // Comparer: when are two company names equal?
    StringComparer.CurrentCultureIgnoreCase);

因为我对公司平等的定义非常简单,所以我可以使用一个已经存在的平等比较器来确定两个公司是否平等。

使用单独比较器进行公司平等的优势在于,如果将来您决定需要其他属性来确定两家公司是否相等,例如其税号,而不是其名称,则此代码不会更改。由您决定是否经常使用“公司平等”的概念来决定是否制作特殊的平等比较器