2012-02-01 45 views
0

我有這樣的方法,按預期工作。嵌套的LINQ IQueryable和WCF WebApi

[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.CustomerModel.Logs。 OrderModel,Proj,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]],因爲它是一個接口。

我的目標:

  • 我希望能夠揭露一個IQueryable接口。
  • 我想返回嵌套的數據。
  • 我想使用我自己的模型,而不是ado.net實體
  • 我想用盡可能少的查詢命中數據庫(最好是一個)。

回答

0

我會強烈建議暴露IQueryable作爲WCF服務的返回類型。

  • WCF的目的是要返回數據
  • 你失去了控制權,查詢的性質不查詢:有人可能潛在的方式,是資源密集型的

理想的情況下使用此查詢,如果你想返回集合使用數組或通用列表。

對於目標列表:

  1. 你能解釋一下嗎?我看不到接口與嵌套數據有什麼關係。
  2. ,您仍然可以返回數組或車型名單
  3. 你有超性能更好的控制,如果你在本地執行查詢並返回結果,而不是

更新:看一看WCF Data Services - 即可能能夠做你想做的事。

+0

這個問題很糟糕,雖然web服務內部使用,只能由一個項目使用,所以我們走了那條路線。 – joelnet 2012-02-01 01:49:42

+0

返回結果列表(而不是IQueryable)不會阻止您嵌套數據。你所做的只是預先填充你想要返回的任何嵌套數據。 – 2012-02-01 01:51:42

+0

IQueryable在WCF中不會混淆。它不像普通的C#代碼 – 2012-02-01 01:58:33

0

如果您嘗試返回JSON:JsonFormatter中的構建無法(de)序列化接口。您應該嘗試從WebApiContrib的JSON.NET格式化程序。

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。

+0

您必須使用IEnumerable和LINQ to Entities。你不能使用數組。 – joelnet 2012-02-02 02:52:38