答案 0 :(得分:1)
问题是你有效地要求你的WCF服务器构建一些它不知道的类型。由于无法这样做,您必须自己在计算机上使用它:
Displays
.Where(d => d.Id == 3136)
.AsEnumerable()
.Select(d => new Info { Name = d.Base.Title })
这将在服务器上运行Where()
,但在您的计算机上运行Select()
。
答案 1 :(得分:1)
正如svick已经提到的,你不能向服务器询问它不理解的类型(至少不使用OData)。但你仍然可以只询问你想要的属性,仅此而已。
由于我没有您的服务,下面的示例使用odata.org上的演示服务:
DemoService ctx = new DemoService(new Uri("http://services.odata.org/OData/OData.svc/"));
var q =
ctx.Products
.Where(p => p.ID == 1)
.Select(p =>
new Product
{
Category = new Category
{
Name = p.Category.Name
}
});
var r =
q.AsEnumerable()
.Select(p =>
new
{
CategoryName = p.Category.Name
});
第一个查询“q”将在服务器上运行(除了创建客户端对象),它只会获取类别的名称(以及有关所有相关实体的元数据)。它将转换为URL / Products(1)?$ expand = Category& $ select = Category / Name。
第二个查询以AsEnumerable开头,它有效地执行第一个查询,然后它只是执行一个简单的转换为匿名类型。这完全在客户端完成(无服务器交互)。