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

时间:2011-05-20 20:57:32

标签: linq silverlight-4.0 wcf-data-services

2 个答案:

答案 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开头,它有效地执行第一个查询,然后它只是执行一个简单的转换为匿名类型。这完全在客户端完成(无服务器交互)。