Linq列表比较和排除

时间:2010-07-19 20:54:57

标签: c# linq

我有两个IQueryable<>列表。假设有一个类Bottle的对象,另一个类型为Cup

这两个类都有一个名为DrinkID的Guid。

如何查看我的Bottle列表并查找Cup列表中DrinkID列表中不包含Bottle的所有项?

我正在寻找类似的东西:

var bottles = _context.AllBottles;
var cups = _context.AllCups.Where(cup => cup.DrinkID not in bottles.DrinkID);

我正在使用Linq to Entities。

5 个答案:

答案 0 :(得分:4)

var bottles = //....
var cups = // ....

bottleLookup = bottles.ToLookup(b => b.DrinkId);
var cupsNotAvailable = cups.Where(c => !bottleLookup.ContainsKey(c.DrinkId);

答案 1 :(得分:3)

cups.Where(c => !bottles.Any(b => c.DrinkID == b.DrinkID) )

答案 2 :(得分:3)

首先,定义一个IHasDrinkID接口(选择一个更好的名称),然后让两个类实现它。

定义一个实现'IEqualityComparer'的类(比如DrinkComparer)。

然后就是

var bottleless =  Cups.Except(Bottles, new DrinkComparer());

答案 3 :(得分:1)

我建议您重新访问该设计,并确保实体映射与您真正想要的层次结构相匹配。

根据您示例的措辞,我推断所有Bottles都是Cups,但您正在寻找一种简单的方法来检索非Bottle Cups 。您需要 对象 对象的 base 对象的集合,这会为设计引发一个红色标记。

如果可能,请稍微清理一下设计:使Cups为抽象基类型,并定义从Cup派生的其他具体类型以填补空白。说,Flask

此时,很容易让EF镜像成为层次结构(使用table-per-concrete-type mapping)。而不是说你有Bottles和非Bottles,你有BottlesFlasks(和其他类型的必要),{{1抽象仍然可用作基类。

答案 4 :(得分:0)

// pull out the ids from the bottles first to prevent re-evaluating for every comparison
var bottle_drink_ids = BottleList.Select(b => b.DrinkID).ToList();
var cups_not_in_bottles_list = CupList.Where(c => !bottle_drink_ids.Contains(c.DrinkID));