我有两个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。
答案 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
,你有Bottles
和Flasks
(和其他类型的必要),{{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));