我有一个名为Companies
的公司列表,里面有重复的公司。
另一个列表relationRepo
保留了companies
和persons
之间的所有关系。
我需要Companies
内部的公司的所有关系。
var relations = relationRepo.Where(x => Companies.Any(y => x.QId == y.QId));
返回公司的关系,但不返回重复的关系。换句话说,对于重复的公司,此查询一次返回关系。例如,Company A
在Companies
中存在两次,并且Company A
中relationRepo
有3种关系。
在上面运行查询后,relations
在Company A
中有3个关系,但我需要6个关系。
有帮助吗?
答案 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();
中提供匹配的项目。上面的查询所做的是QId
中Companies
的匹配行,因此在您的情况下,如果QId
有6个项目,而Companies
在QId
中匹配,将在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
。如果两家公司实际上是同一家公司,那么您希望它们作为一家“具有关联关系的公司”退回。
因此在上面的示例中,您想要以下结果
此要求的问题是,如果您认为两家公司相等(例如,因为它们的名称相同),那么您希望拥有不同的Company属性吗?例如:对于名称为“ Acme”的公司应使用什么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);
因为我对公司平等的定义非常简单,所以我可以使用一个已经存在的平等比较器来确定两个公司是否平等。
使用单独比较器进行公司平等的优势在于,如果将来您决定需要其他属性来确定两家公司是否相等,例如其税号,而不是其名称,则此代码不会更改。由您决定是否经常使用“公司平等”的概念来决定是否制作特殊的平等比较器