我正在尝试将显示的各个部分及其位置列表从WCF数据服务投影到自定义类型中。这在Silverlight客户端的WCF数据服务中是可行的吗?有一些帮助here,但它没有显示返回列表和简单字符串。
目前我得到了"NotSupportedException:不支持使用表达式d.Base.Title构造或初始化UserQuery+Info类型的实例“。如果你能告诉我如何在这个语法中展开位置(我知道Displays.Expand(" Locations ")),或者我是否需要它,那就太好了。
LINQPad代码段
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;}
}发布于 2011-05-21 05:12:51
问题是,您实际上是在请求您的WCF服务器构造一些它不知道的类型。由于它无法执行此操作,因此您必须在您的计算机上自己执行此操作:
Displays
.Where(d => d.Id == 3136)
.AsEnumerable()
.Select(d => new Info { Name = d.Base.Title })这将在服务器上运行Where(),但在您的计算机上运行Select()。
发布于 2011-05-21 18:16:21
正如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“将在服务器上运行(除了客户端对象的创建),它将只获得类别的名称(以及有关所有实体的元数据)。它会被转换成像/Products(1)?$expand=Category&$select=Category/Name.这样的网址
第二个查询从AsEnumerable开始,它有效地执行第一个查询,然后它只执行一个简单的转换为匿名类型。这完全是在客户端上完成的(没有服务器交互)。
https://stackoverflow.com/questions/6077517
复制相似问题