嵌套的LINQ IQueryable和WCF WebApi

时间:2012-02-01 01:33:30

标签: wcf linq wcf-web-api

我有一个这样的方法按预期工作。

[WebGet]
public IQueryable<BuildJobModel> GetCustomers()
{
    var context = new MyDataContext(); // ADO.NET Entity Data Model
    var query = from c in context.Customers
                select new CustomerModel {
                    Id = c.Id,
                    Name = c.Name
                };
    return query;
}

但是当我尝试创建这样一个更复杂的查询时,它不起作用。

[WebGet]
public IQueryable<BuildJobModel> GetCustomers()
{
    var context = new MyDataContext(); // ADO.NET Entity Data Model
    var query = from c in context.Customers
                select new CustomerModel {
                    CustomerId = c.CustomerId,
                    Name = c.Name,
                    Orders = from o in c.Orders
                             select new OrderModel {
                                 OrderId = o.OrderId,
                                 Details = o.Details
                             }
                };
    return query;
}

模型看起来像这样:

public class CustomerModel
{
    public int CustomerId { get; set; }
    public string Name { get; set; }
    public IEnumerable<OrderModel> Orders { get; set; }
}

public class OrderModel
{
    public int OrderId { get; set; }
    public string Details { get; set; }
}

例外:

无法序列化类型为System.Collections.Generic.IEnumerable`1 [[Proj.OrderModel,Proj,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]]的成员Proj.CustomerModel.Logs,因为它是一个接口

我的目标:

  • 我希望能够公开一个IQueryable接口。
  • 我想返回嵌套数据。
  • 我想使用自己的模型,而不是ado.net实体
  • 我希望尽可能少地查询数据库(一个是最好的)。

3 个答案:

答案 0 :(得分:0)

我强烈建议IQueryable公开为WCF服务的返回类型。

  • WCF旨在返回数据而不是查询
  • 您无法控制查询的性质:某人可能会以资源密集的方式使用此查询

理想情况下,如果要返回集合,请使用数组或通用列表。

关于目标列表:

  1. 你能解释一下吗?我没有看到IQueryable接口与嵌套数据有什么关系。
  2. 您仍然可以返回 模型
  3. 的数组或列表
  4. 如果您在本地执行查询并返回结果
  5. ,则可以更好地控制性能

    更新:查看WCF Data Services - 可能会做您想做的事。

答案 1 :(得分:0)

如果您尝试返回JSON:JsonFormatter中的构建无法(de)序列化接口。您应该从WebApiContrib尝试JSON.NET Formatter。

答案 2 :(得分:0)

我认为你只需要使用一个数组而不是IEnumerable,就像这样......

public class CustomerModel
{
    public int CustomerId { get; set; }
    public string Name { get; set; }
    public OrderModel[] Orders { get; set; }
}

public class OrderModel
{
    public int OrderId { get; set; }
    public string Details { get; set; }
}

如果您将其序列化为json / xml,我怀疑内置序列化程序不知道如何处理IEnumerable。