Skip to main content
 首页 » 编程设计

c#之linq之如何查找一个集合的键列是否是另一个集合的子集

2024年02月27日37yxwkf

我在 C# 中使用 .NET 4.5,我有两个不同类的集合,我正在尝试比较它们。它们有一些名称相似的列,但它们没有实现通用接口(interface)(并且由于编码标准原因不能实现)。

第一类看起来像这样:

class Foo 
{ 
    string Key1 {get; set;} 
    string Key2 {get; set;} 
    string NotKey {get; set;} 
    string AlsoNotKey {get; set;} 
} 

虽然第二个看起来像这样:

class Bar 
{ 
    string Key1 {get; set;} 
    string Key2 {get; set;} 
} 

我想做的是将 Foo 的集合传递到一个方法中,并在每对不同的 Key1 和 时返回 true >Key2 与从数据库(通过 EF)检索到的 Bar 集合相匹配,但我不知道该怎么做。

我的第一个想法是这样的......

//IEnumerable<Foo> foos 
//DbSet<Bar> bars 
foos.All(foo => foo.Key1 == bars.Key1 && foo.Key2 == bars.Key2) 

...但它不起作用,因为 bars 也是一个集合,我不能只在每一列周围使用 Contains() 因为那样它就赢了'将两列作为一对进行比较。

在 SQL 中,我可以做类似的事情

SELECT COUNT(*) 
FROM foos 
JOIN bars 
ON foos.key1 = bars.key1 
AND foos.key2 = bars.key2 

并将其与 foos 本身的记录数进行比较,但如何将其转换为 LINQ?

编辑:找到了这个相关问题。 How to use linq `Except` with multiple properties with different class?

可能会尝试这样的事情,除非有更好的方法。

foos.All(f => bars.Any(b => f.Key1 == b.Key1 && f.Key2 == b.Key2)) 

请您参考如下方法:

试试这个:

var x = (from f in foos 
         join b in bars on new { f.Key1, f.Key2 } equals new { b.Key1, b.Key2 } 
         select f).Count(); 

我知道它是一个长格式,但在这种情况下它比短格式更具描述性。

显然,重要的假设是您的 key 不会重复。如果他们这样做,你会得到错误的项目计数