WCF数据服务+LINQ投影到自定义类型
我试图将WCF数据服务中的部分显示及其位置列表投影到自定义类型中。这在Silverlight客户端的WCF数据服务中可行吗?这里有一些帮助,但它并没有显示返回列表以及简单字符串 当前我得到的是NotSupportedException:不支持使用表达式d.Base.Title构造或初始化UserQuery+Info类型的实例。。 如果您能告诉我如何使用我知道的Displays.ExpandLocations语法在位置上展开,或者如果我需要的话,这将是一个额外的好处 LINQPad代码段WCF数据服务+LINQ投影到自定义类型,linq,silverlight-4.0,wcf-data-services,Linq,Silverlight 4.0,Wcf Data Services,我试图将WCF数据服务中的部分显示及其位置列表投影到自定义类型中。这在Silverlight客户端的WCF数据服务中可行吗?这里有一些帮助,但它并没有显示返回列表以及简单字符串 当前我得到的是NotSupportedException:不支持使用表达式d.Base.Title构造或初始化UserQuery+Info类型的实例。。 如果您能告诉我如何使用我知道的Displays.ExpandLocations语法在位置上展开,或者如果我需要的话,这将是一个额外的好处 LINQPad代码段 var
var displays = from d in Displays.Where(d => d.Id == 3136)
select new Info
{
Name = d.Base.Title,
};
displays.Dump();
}
public class Info
{
private string name;
public string Name
{
get
{
return this.name;
}
set
{
this.name = value;
}
}
public IEnumerable<Location> locations;
public IEnumerable<Location> Locations
{
get{ return this.locations;}
set{ this.locations = value;}
}
问题在于,您实际上是在要求WCF服务器构造它不知道的某种类型。由于无法执行此操作,您必须自己在计算机上执行此操作:
Displays
.Where(d => d.Id == 3136)
.AsEnumerable()
.Select(d => new Info { Name = d.Base.Title })
这将在服务器上运行Where,但在您的计算机上运行Select。正如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,如/Products1?$expand=Category&$select=Category/Name
第二个查询以AsEnumerable开始,它有效地执行第一个查询,然后只执行到匿名类型的简单转换。这完全是在客户机上完成的,无需与服务器交互。因此,numerable必须告诉它等待在服务器上完成。它仍然带回了我希望避免的所有数据。我想只有简单的类型才能限制有效负载。@Kevin,我不知道WCF,但有些提供程序可以处理匿名类型的创建。