Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WCF数据服务+LINQ投影到自定义类型_Linq_Silverlight 4.0_Wcf Data Services - Fatal编程技术网

WCF数据服务+LINQ投影到自定义类型

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

我试图将WCF数据服务中的部分显示及其位置列表投影到自定义类型中。这在Silverlight客户端的WCF数据服务中可行吗?这里有一些帮助,但它并没有显示返回列表以及简单字符串

当前我得到的是NotSupportedException:不支持使用表达式d.Base.Title构造或初始化UserQuery+Info类型的实例。。 如果您能告诉我如何使用我知道的Displays.ExpandLocations语法在位置上展开,或者如果我需要的话,这将是一个额外的好处

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;}
}

问题在于,您实际上是在要求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,但有些提供程序可以处理匿名类型的创建。