WCF数据服务扩展为Linq声明

时间:2012-09-15 15:07:23

标签: c# wcf linq wcf-data-services expand

目前我正在尝试使用WCF数据服务。现在我试图通过Include语句向我的Servie查询类似于EF(这是我的服务的数据源)的一些对象,以获得一个objecttree。

我的陈述现在看起来像这样:

var query = this.Entities.Veranstaltung.Expand( "VeranstaltungMaterial/Material/Template" ).Expand( "Ort,Dozent" );

var k = query.Where( z => z.DauerTage > 5 && z.TemplateID == null );

是否可以通过LINQ编写Expandstatement,以便自动翻译?

2 个答案:

答案 0 :(得分:1)

我想您的问题是:我是否可以通过常规linq语句来获取导航属性,而不是特定于WCF-DS的Expand语句?如果是这样,答案是"是的,我们可以"。

当然我无法使用您的示例,但如果我连接到Northwind OData服务 1 ,我可以这样做:

Order_Details.Expand("Order/Customer").Expand("Product/Order_Details").Take (1)

Order_Details.Take(1).Select(o => 
                      new { o.Order.Customer, o.Product.Order_Details })

不完全等同(并且几乎没用),但还可以。

在网址中,您会看到第二个语句也被翻译为expand


  1. http://services.odata.org/V3/Northwind/Northwind.svc/

答案 1 :(得分:1)

Gert的回答是正确的,只是想扩展它(并且不能将其纳入评论): 您甚至可以使用“使用LINQ扩展”来表达第一个查询:

Order_Details.Take(1).Select(od =>
    new Order_Detail
    {
        Order = new Order
        {
            Customer = od.Order.Customer
        },
        Product = new Product
        {
            Order_Details = od.Product.Order_Details
        },
    });

您可以使用m:n关系执行类似的操作。该样本遵循1:n关系,但方向相反:

Customers.Select(c =>
    new Customer
    {
        Orders = c.Orders.Select(o =>
            new Order
            {
                Order_Details = o.Order_Details
            });
    });

这相当于〜/ Customers?$ expand = Orders / Order_Details& $ select = Orders / Order_Details。