【问题标题】:Nested LINQ IQueryable and WCF WebApi嵌套 LINQ IQueryable 和 WCF WebApi
【发布时间】:2023-03-28 17:25:01
【问题描述】:

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

[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 实体
  • 我想用尽可能少的查询访问数据库(最好有一个)。

【问题讨论】:

    标签: wcf linq wcf-web-api


    【解决方案1】:

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

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

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

    关于你的目标列表:

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

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

    【讨论】:

    • 这个问题被提出来了,尽管 Web 服务是在内部使用并且由一个项目独占,所以我们走那条路。
    • 返回结果列表(而不是 IQueryable)不会阻止您拥有嵌套数据。您所做的就是预先填充您想要返回的任何嵌套数据。
    • IQueryable 在 WCF 中没有被弄乱。它不像普通的 c# 代码
    • WCF Web API (!= 经典 WCF) 中的 IQueryable 用于 OData 之类的查询。
    • 我想使用 IQueryable 以便根据请求生成 SQL 查询。我也想返回嵌套数据,因为那是我需要的数据集。
    【解决方案2】:

    如果您尝试返回 JSON:JsonFormatter 中的构建无法(反)序列化接口。您应该尝试来自WebApiContrib 的 JSON.NET 格式化程序。

    【讨论】:

      【解决方案3】:

      我认为你只需要使用一个数组而不是 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。

      【讨论】:

      • 您必须将 IEnumerable 与 LINQ to Entities 一起使用。你不能使用数组。
      猜你喜欢
      • 1970-01-01
      • 2012-08-06
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      • 2015-03-29
      • 1970-01-01
      • 2016-06-17
      • 2016-03-18
      相关资源
      最近更新 更多