代码之家  ›  专栏  ›  技术社区  ›  Vaccano

LINQ列表比较和排除

  •  3
  • Vaccano  · 技术社区  · 14 年前

    我有两个 IQueryable<> 列表。说一个人满是类的对象 Bottle 另一个是类型 Cup .

    两个类都有一个名为 DrinkID .

    我要怎么做 列出并查找 杯子 列出具有 饮酒儿童 那不在 名单?

    我在找这样的东西:

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

    我正在使用Linq to实体。

    5 回复  |  直到 14 年前
        1
  •  3
  •   Winston Smith    14 年前
    cups.Where(c => !bottles.Any(b => c.DrinkID == b.DrinkID) )
    
        2
  •  4
  •   driis    14 年前
    var bottles = //....
    var cups = // ....
    
    bottleLookup = bottles.ToLookup(b => b.DrinkId);
    var cupsNotAvailable = cups.Where(c => !bottleLookup.ContainsKey(c.DrinkId);
    
        3
  •  3
  •   Winston Smith    14 年前

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

    定义实现“IEqualityComparer”的类(例如 DrinkComparer )

    然后它只是

    var bottleless =  Cups.Except(Bottles, new DrinkComparer());
    
        4
  •  1
  •   Stephen Cleary    14 年前

    我建议重新审视设计,并确保实体映射符合您真正想要的层次结构。

    从你的例子中,我推断出 Bottles Cups ,但您正在寻找一种简单的方法来检索- Bottle 杯子 . 你需要收集 基础 对象是 特定类型的 衍生的 对象引发设计的红旗。

    如果可能的话,把设计弄干净一点:做 杯子 抽象基类型,并定义派生自 Cup 填补空白。说, Flask .

    在这一点上,很容易让ef反映等级(使用 table-per-concrete-type mapping )而不是说你 你已经得到了 Flasks (和其他类型,如有必要) 杯子 抽象仍然可用作基类。

        5
  •  0
  •   Jay    14 年前
    // 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));