SelectMany - 项目到新类型?

时间:2014-05-05 16:14:18

标签: vb.net linq

我有一个linq表达式

Dim sources = details.Datasources _
                     .SelectMany(Function(s) _defs.Item(s.Name)) _
                     .Select(Function(d) New AliasedDatasource With {.Alias = "", .DefDetails = d}) _
                     .Where(Function(s) s.DefDetails.Dataview = dataview) _
                     .Select(Function(d) d)

注意:

  • details.Datasources是一个IEnumerable
  • 每个数据源都有一个"名称"和#34; Alias"属性
  • 每个DefDetails包含一个" Key"财产(以及其他东西)
  • _defs是一个ILookup,因此是一个列表列表
  • 数据源可能具有相同的名称,因此_defs.Item(s.Name)可以返回多个列表列表

我正在尝试

  1. 将ILookup压缩为名称与数据源名称匹配的条目
  2. 创建一个新的自定义类型,它将datasource.Alias与返回的DefDetails结合起来。
  3. 在第

    .Select(Function(d) New AliasedDatasource With {.Alias = "", .DefDetails = d}) _
    

    我有效地尝试这样做

    .Select(Function(d) New AliasedDatasource With {.Alias = s.Alias, .DefDetails = d}) _
    

    但显然s.Alias对那个lambda是不可见的。

    那么我应该如何重写这一点以实现我的目标。我想知道是否实际上SelectMany上有一个Overload,它允许我投射到一个新类型,但我正在努力解决它。

    很多thx

    取值

2 个答案:

答案 0 :(得分:1)

行。所以我发现了重载并且它“简化”到了......

Dim sources = details.Datasources _
                     .SelectMany(Function(s) _defs.Item(s.Name).Where(Function(d) d.DataviewKey = dataview),
                                 Function(s, d) New AliasedDatasource With {.Name = d.Name, .Alias = s.Alias, .Key = d.Key, .DataviewKey = d.DataviewKey})

THX

答案 1 :(得分:1)

查询语法是你的朋友:

Dim sources = From s In details.Datasources _
              From d In _defs.Item(s.Name) _
              Where s.DefDetails.Dataview = dataview _
              Select New AliasedDatasource With { _
                                                  .Name = d.Name, _
                                                  .Alias = s.Alias, _
                                                  .Key = d.Key, _
                                                  .DataviewKey = d.DataviewKey _
                                                }

From .. From构造编译为SelectManySelect子句中的项目确定了哪个重载。