2012-01-12 47 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