2012-01-12 53 views
3

我正在將實體對象轉換爲我自己的模型(CustomerModel和OrderModel)。如何使用LINQ to Entities(使用變換)返回嵌套數據集?

我現在有一個返回我的客戶一個IQueryable方法:

IQueryable<CustomerModel> GetCustomers() 
{ 
    return from c in entities.Customers 
      select new CustomerModel { 
       CustomerId = c.CustomerId, 
       CustomerName = c.CustomerName 
       // Orders = ?? 
      }; 
} 

在我CustomerModel,你可以看到我有訂單的數組。

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

class OrderModel { 
    public int OrderId { get; set; } 
    public int CustomerId { get; set; } 
    public string OrderDetails { get; set; } 
} 

我似乎無法弄清楚訂單類型爲Array時,如何設置Customer對象內部的Orders。

當我將CustomerModel的訂單更改爲IEnumerable而不是數組,並且不能將.ToArray()與LINQ to Entities一起使用時,我能夠做到這一點,所以我被卡住了。

所以我的問題是:這是可能做的使用陣列的訂單?

問題的答案:

  • 爲什麼一個數組?我在其他地方返回一個數組(供其他項目使用),並且訂單也是一個數組也是有意義的。

此外,您不能對訂單使用ToArray的(),將引發此錯誤:

System.NotSupportedException: LINQ to Entities does not recognize the method 'Proj.Models.Orders[] ToArray[Orders](System.Collections.Generic.IEnumerable`1[Proj.Models.Orders])' method, and this method cannot be translated into a store expression. 
+0

爲什麼你想要一個數組?首先,您可以使用Enumerable或Queryable中的.ToArray(),但數組意味着L2E難以跟蹤的事情(如排序和可變性)。 – 2012-01-12 00:37:35

回答

4

如果您OrdersCustomers訪問有用的,你可以試試:

IQueryable<CustomerModel> GetCustomers() 
{ 
    return from c in entities.Customers 
      select new CustomerModel { 
       CustomerId = c.CustomerId, 
       CustomerName = c.CustomerName 
       Orders = from o in c.Orders 
         select new Order{ 
          OrderId = o.OrderId, 
          ... 
         } 
      }; 
} 

這需要你改變Customer.OrdersIEnumerable<Order>。這是將對象圖加載到數據庫的唯一方法。

+0

我相信你對此可能是對的。我感覺IEnumerable是唯一的方法。謝謝。 – joelnet 2012-01-12 20:17:20

2

當我們的數據訪問方法返回業務對象(模型)不是很好的做法。您可以編輯例如查詢以這樣一種方式:

IQueryable<Customer> GetCustomers() 
{ 
    return entities.Customers; 
} 

IQueryable<Order> GetOrders() 
{ 
    return entities.Orders; 
} 

IEnumerable<CustomerModel> GetCustomerModels() 
{ 
    var result = from c in GetCustomers() 
       let orderModels = from o in GetOrders() 
            where o.CustomerId == c.CustomerId 
            select new OrderModel 
            {....} 
       select new CustomerModel 
       { 
        CustomerId = c.CustomerId, 
        CustomerName = c.CustomerName, 
        Orders = orderModels.ToArray() 
       }; 
    return result; 
} 

,如果這個解決方案是不適合你,請描述你的「實體」

+0

IQueryable方法位於特殊的存儲庫上。返回的模型也位於存儲庫級別。原因是保持私有實際的ADO.NET實體。另一個原因是我們可以在沒有任何代碼影響的情況下進行替換。 – joelnet 2012-01-12 03:19:52

+0

您不能使用LINQ to Entities調用ToArray()!這是結果的錯誤:System.NotSupportedException:LINQ to Entities不能識別方法'Proj.Models.Orders [] ToArray [Orders](System.Collections.Generic.IEnumerable'1 [Proj.Models.Orders])'方法,並且此方法不能轉換爲商店表達式。 – joelnet 2012-01-12 03:21:19

+0

在這種情況下,您必須首先執行您的實體枚舉..不是很好的主意,但仍然..你能詳細描述你的客戶實體嗎? – akekir 2012-01-12 07:12:47

相關問題