假设我们有这两个类:
class GenericFoo
{
public Guid ID;
...
}
class SpecialFoo
{
public Guid ID;
public Guid GenericFooID;
...
}
GenericFoo 是一种模板类,可以从中创建 SpecialFoos。
现在,我有一个DbSet<GenericFoo> g
和一个DbSet<SpecialFoo> s
。g 中可能存在任何 SpecialFoo.GenericFooID ,但也可能缺失。(例如,GenericFoo 可能已被删除)。当然,反之亦然。
我想要的是调用那些缺少匹配 GenericFooID 的调用,例如:
missing = s.Except(g)
那是行不通的,因为除了只适用于相同的类。现在我已经通过使用一个相当人为的解决方案解决了这个问题:
ExistingIds = g.Select(f=>f.ID);
missing = s.Where(f => !ExistingIds.Contains(s.GenericFooID));
这里的一个主要缺点是我们失去了类型安全性(如果有人输入错误 g 并指定了类似的类,则无法检查这一点)。我更喜欢有类似的东西,IComparer<type1, type2>
这样Except
电话才能工作。
我发现的其他选项是
- 使用组加入进行“假左加入”,并保持不匹配
- 将第一个转换为字典、哈希表等只是为了加快速度
- 尝试创建一个 Generic->Special 转换器,然后创建一个 IComparer 只是为了使用
Except
我的问题是:
- 有没有更好的方法来解决这个问题,只是谈论 linq to objects?
- 在实体框架的背景下,解决这个问题的最快方法是什么?