如何从LINQ Join返回分层匿名类型?

时间:2010-03-08 16:37:15

标签: linq-to-entities

如何编写从Join?

返回分层匿名类型的LINQ查询

澄清我的意思: 使用WCF数据服务和Telerik WPF RadTreeView,可以轻松查询和显示分层数据:

    Dim q = _ctx1.Execute(Of NorthwindDataService.Customers)(New Uri("Customers\?$expand=Orders", UriKind.Relative))
    Dim td As New GridViewTableDefinition
    td.Relation = New Telerik.Windows.Data.PropertyRelation("Orders")
    RadGridView1.ChildTableDefinitions.Add(td)
    Dim r = q.ToList
    RadGridView1.ItemsSource = r

我希望加入来自不同数据服务的实体,并将其显示在层次网格中。

Dim q = From c In _ctx1.Customers.ToList
Join o In _ctx2.Orders.ToList On c.CustomerID Equals o.CustomerID
  Select New With {c.CustomerID,
                       o.OrderId
                      }

加入有效。 如何“选择”具有Customer和Orders属性的所有属性的匿名类型, 类似于数据服务返回的内容,它直接绑定到网格?

类似的东西(这是不支持的语法!):       选择New With {c。*,                            。订单= o                           }

1 个答案:

答案 0 :(得分:1)

对于两种不同的数据服务,您可以使用LINQ to Objects:

Dim q1 = _ctx1.Customers.AsEnumerable()
Dim q2 = _ctx2.Orders.ToList()

Dim q = From c in q1
        Select New With {c.CustomerID,
                         q2.Where(o => o.CustomerID == c.CustomerID)
                        }

再一次,我为VB.NET语法错误提前道歉。

对于一项服务:

It's almost always a mistake to use join in LINQ to Entities or LINQ to SQ L。

与数据服务查询的直接比喻是:

Dim q = _ctx1.Customers.Include("Orders");

但您也可以按照您的L2E示例投影:

Dim q = From c In _ctx1.Customers.ToList
        Select New With { c.CustomerID,
                          From o in c.Orders Select o.OrderID}

提前为语法错误道歉; VB.NET不是我的强项。