gpt4 book ai didi

c# - 林奇 : Nesting this into a single query

转载 作者:行者123 更新时间:2023-12-04 00:26:20 26 4
gpt4 key购买 nike

我知道有一个 brazillion SO 和其他地方的 LINQ 嵌套查询示例,但这对我来说没有意义。如果有人能像我五岁那样解释这一点,我将不胜感激。这都是伪混淆的,所以请耐心等待这个人为的例子。

我有一个 EF 模型,其中包含:

public class Car(){
public String Vin {get; private set;}
public string Type {get; private set;}
public List<Option> Options {get; set;}
}

public class Option(){
public string Name { get; set; }
}

我得到了 IQueryable<Car> cars 的集合来自存储库。

很简单。目标是:

  1. 列出所有汽车类型(比如“卡车”、“suv”、“小型货车”等)
  2. 在每种类型下,都有该类型汽车上存在的选项名称的子列表。
  3. 在每个选项下,列出具有该选项且属于该类型的每辆汽车的 VIN。

所以列表看起来像:

  • 卡车
    • 拖车 Hook
      • vin1
      • vin8
    • 卡车螺母
      • vin2
      • vin3
      • vin4
    • 枪架
      • vin1
    • 可折叠后座
      • vin2
      • vin3
  • 小型货车
    • 旋转座椅
      • vin6
    • DVD 播放器
      • vin6
      • vin10
    • 可折叠后座
      • vin6
      • vin10
  • buggy
    • 可折叠后座
      • vin9
      • vin5

你可能明白了。我知道我可以按类型对汽车进行分组,如下所示:

from c in cars
group by c.Type into g

但我认为我需要做的是组 Vin进入Option并将结果分组到类型中。我也认为我可能需要

cars.SelectMany(c => c.Options)
.Select(o => o.Name)
.Distinct();

获取唯一选项名称的列表,但我不确定 a) 这是执行此操作的最有效方法以及 b) 如何将其合并到我的分组查询中。我真的不明白如何编写嵌套分组查询来完成此操作 - 第一组是外部组还是内部组?

我对此的理解不足,所以请再一次:像我五岁一样解释。

感谢大家。

最佳答案

这肯定不是一个微不足道的查询。

我会这样做:

cars.SelectMany(c => c.Options.Select(o => new { Car = c, Option = o.Name }))
.GroupBy(x => x.Car.Type)
.Select(x => new
{
Type = x.Key,
Options = x.GroupBy(y => y.Option, y => y.Car.Vin)
.Select(y => new { Option = y.Key,
Cars = y.ToList() } )
});

此查询执行以下操作:

  1. 我们稍微更改了我们处理的数据以使其更易于处理:您希望在汽车上方有选项。这意味着最终结果将使每辆车都可能处于多个选项下,因此我们真正需要的是一个 (Option, Car) 元组列表。

    我们通过

    实现了这一点
    cars.SelectMany(c => c.Options.Select(o => new { Car = c, Option = o.Name }))

    这基本上是说:为每辆汽车和每个选项选择一个新的匿名类型,并将汽车和选项名称作为属性。我们将该匿名类型命名为 Ano1。

    结果将是 IEnumerable<Ano1> .

  2. 此平面数据现在按汽车类型分组。这意味着对于每种车型,我们都有一个 Ano1 实例列表。所以我们现在有一个组列表,每个组都有一个 Ano1 实例列表。

  3. 在这个组列表中,我们发出一个选择。对于每个组(= 汽车类型),选择返回一个新的匿名类型,其中包含汽车类型的属性 - 这样信息就不会丢失 - 以及选项的属性。

  4. 上一步中的选项最终将成为具有属性 Option 和 Cars 的匿名类型列表。为获取此数据,我们按选项对我们的所有 Ano1 实例进行分组,并选择汽车的 VIN 作为组内的元素。这些组现在已转换为新的匿名类型,具有选项名称的属性和汽车的属性。

查询并不简单,解释也是如此。有什么不明白的请追问。

关于c# - 林奇 : Nesting this into a single query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12516222/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com