我在 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 和 时返回 与从数据库(通过 EF)检索到的 true >Key2Bar 集合相匹配,但我不知道该怎么做。
我的第一个想法是这样的......
//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 不会重复。如果他们这样做,你会得到错误的项目计数
