0

假设我们有这两个类:

class GenericFoo
{
   public Guid ID;
   ...
}

class SpecialFoo
{
   public Guid ID;
   public Guid GenericFooID;
   ...
}

GenericFoo 是一种模板类,可以从中创建 SpecialFoos。

现在,我有一个DbSet<GenericFoo> g和一个DbSet<SpecialFoo> sg 中可能存在任何 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

我的问题是:

  1. 有没有更好的方法来解决这个问题,只是谈论 linq to objects?
  2. 在实体框架的背景下,解决这个问题的最快方法是什么?
4

2 回答 2

0

现在,这是一个很长的镜头,因为它非常深奥,但是您想要一个由没有实际关系的人过滤的外部连接。你可以试试:

from specialFoo in context.SpecialFoos
join genericFoo in context.GenericFoos 
     on specialFoo.GenericFooID equals genericFoo.ID 
     into gj
where !gj.Any()
select specialFoo;
于 2013-06-28T00:12:27.463 回答
-1

这可能适用于两种情况:

var missing = s.Where(a => !g.Any(b => b.ID == a.GenericFooID));
于 2013-06-27T21:10:20.837 回答