如何使用LINQ to Entities(带变换)返回嵌套数据集?

时间:2012-01-12 00:34:19

标签: c# .net linq linq-to-entities

我正在将实体对象转换为我自己的模型(CustomerModel和OrderModel)。

我目前有一个IQueryable方法可以返回我的客户:

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

在我的CustomerModel中,您可以看到我有一个Orders数组。

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; }
}

当Orders类型为Array时,我似乎无法弄清楚如何在Customer对象中设置Orders。

当我将CustomerModel的Orders更改为IEnumerable而不是数组时,我能够做到这一点,你不能将.ToArray()与LINQ to Entities一起使用,所以我被卡住了。

所以我的问题是:这是否可以使用Array for Orders?

问题解答:

  • 为何选择阵列?我正在其他地方返回一个数组(供其他项目使用),并且将Orders也作为数组也是有意义的。

此外,您无法使用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.

2 个答案:

答案 0 :(得分:4)

如果Orders可以从Customers访问,您可以尝试:

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.Orders更改为IEnumerable<Order>。这是在一个请求中将对象图加载到数据库的唯一方法。

答案 1 :(得分: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;
}

如果此解决方案对您没用,请描述您的“实体”