【问题标题】:Method based query for this Linq Expression此 Linq 表达式的基于方法的查询
【发布时间】:2016-06-24 11:23:19
【问题描述】:

大家好,

        Employee[] empCollection =
            new Employee[]{

                   new Employee()
        {
            Name = "Test1",
            Salry = "1000",
            Notes = new string[] { "A","B","C","D"}
        },

        new Employee()
        {
              Name = "Test2",
            Salry = "2000",
            Notes = new string[] { "E","F","G","H"}

          }

            };


        var data = from e in empCollection
                   from n in e.Notes
                   select new { Name = e.Name, note = n };

测试1:B 测试1:C 测试1:D 测试2:E 测试2:F 测试2:G 测试2:H

我想知道这个查询的基于 synatx 的等效方法?

我试过了

var data = empCollection.Select(
            e =>
                e.Notes.Select(n => new
                {
                    name = e.Name,
                    note = n
                }
                )
            );

但我无法在 foreach 循环中获取名称和注释,为什么?

谢谢。

【问题讨论】:

  • 首先我有一个建议 - 看看软件“linqpad”它会帮助你解决这些问题!

标签: c# linq


【解决方案1】:

您的代码返回IEnumerable<IEnumerable<T>>,您需要使用SelectMany 将您的结果“展平”为IEnumerable<T>

var data = empCollection
    .SelectMany(e => e.Notes.Select(n => new {name = e.Name, note = n}));

根据the documentation,您原来的编译器从查询到方法语法的机械翻译使用SelectMany 的重载,创建了一个匿名类型来配对这两个项目,以便它们可以在投影中使用(注意这个由于编译器发明的变量名,实际上不会编译):

var data = empCollection
    .SelectMany(e => e.Notes, (e, n) => new {e, n})
    .Select($1 => new { name = $1.e.Name, note = $1.n });

当然,这可以被简化,你最终会在编译器生成的代码和你的原始代码之间的某个地方结束:

var data = empCollection
    .SelectMany(e => e.Notes, (e, n) => new {name = e.Name, note = n});

请参阅this fiddle 以获取演示。

【讨论】:

  • 谢谢。但我无法在您提到的结果集合上使用此代码。 foreach(var item in data) { Console.WriteLine(item.Name +":"+item.note); }
  • 请对此进行基于等效方法的查询。
    var data = from e in empCollection from n in e.Notes select new { Name = e.Name, note = n };
猜你喜欢
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-12
相关资源
最近更新 更多