C# WCF数据服务扩展为Linq语句
目前,我正在尝试使用WCF数据服务。现在,我试图用Include语句查询我的服务中与EF(这是我的服务数据源)类似的一些对象,以获得objecttree 此时此刻,我的陈述如下:C# WCF数据服务扩展为Linq语句,c#,wcf,linq,wcf-data-services,expand,C#,Wcf,Linq,Wcf Data Services,Expand,目前,我正在尝试使用WCF数据服务。现在,我试图用Include语句查询我的服务中与EF(这是我的服务数据源)类似的一些对象,以获得objecttree 此时此刻,我的陈述如下: var query = this.Entities.Veranstaltung.Expand( "VeranstaltungMaterial/Material/Template" ).Expand( "Ort,Dozent" ); var k = query.Where( z => z.DauerTage &g
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,使其自动转换?我想您的问题是:我是否可以通过常规LINQ语句而不是WCF DS特有的
Expand
语句来访问导航属性?如果是,答案是“是的,我们可以”
当然,我不能使用您的示例,但如果我连接到Northwind OData服务1,我可以:
Order_Details.Expand("Order/Customer").Expand("Product/Order_Details").Take (1)
或
不完全相同(而且几乎没有用处),但还可以
在URL中,您将看到第二条语句也被翻译为expand
格特的回答是正确的,只是想进一步说明(但无法将其纳入评论中): 您甚至可以使用Expand来表示第一个查询,只需使用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\u Details&$select=Orders/Order\u Details。m:n关系如何?使用LinQ,您可能会在第二个点进入一个集合。这不是一个技巧,但对于集合中的每个实体来说,这是到服务器的额外往返。我想避免这种情况:(不,这不是往返。WCF DS客户端LINQ提供程序从不将表达式转换为多个请求。如果不能在一个请求中转换,则转换将失败。您可以通过将上述表达式的结果存储在变量中并对其调用ToString进行验证。它将返回要执行的URL查询。
Customers.Select(c =>
new Customer
{
Orders = c.Orders.Select(o =>
new Order
{
Order_Details = o.Order_Details
});
});