Как я могу использовать LINQ to Entities (с преобразованием) для возврата вложенного набора данных? - PullRequest
3 голосов
/ 12 января 2012

Я выполняю преобразование объектов-сущностей в свои собственные модели (CustomerModel и OrderModel).

В настоящее время у меня есть метод IQueryable, который возвращает моих клиентов:

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

Inмоя 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 внутри объекта Customer, когда тип Orders имеет тип Array.

Я смог сделать это, когда я изменил OrdersModel Orders на IEnumerable вместо массива, и вы не можете использовать .ToArray () с LINQ to Entities, поэтому я застрял.

Так что мой вопрос:Можно ли это сделать, используя массив для заказов?

Ответы на вопросы:

  • Почему массив?Я возвращаю массив (для использования другими проектами) в другом месте, и было бы разумно, чтобы 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 ]

4 голосов
/ 12 января 2012

Если ваш 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>.Это единственный способ загрузить граф объекта в одном запросе к базе данных.

2 голосов
/ 12 января 2012

Не очень хорошая практика, когда наш метод доступа к данным возвращает бизнес-объекты (модели). Например, вы можете редактировать свои запросы следующим образом:

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

если это решение для вас бесполезно, опишите ваши "сущности"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...