Запрос Entity Framework для возврата только частичных графов объектов - PullRequest
3 голосов
/ 11 марта 2011

У меня немного болит голова, когда я решаю эту проблему. Итак, вот оно: Допустим, у меня есть 3 таблицы:

  • Клиенты
  • Заказы
  • Продукты

Я хочу получить список клиентов и их заказов с некоторой фильтрацией по полям некоторых клиентов и заказов и вернуть график, который показывает только основную информацию о каждой сущности.
Например, у Клиента может быть 19 полей, но я хочу только прочитать его ID, FirstName, LastName и из заказов, я хочу только прочитать NetPrice и идентификаторы связанных продуктов так, чтобы при выполнении итерации запроса генерируемый SQL очень легкий и будет выбирать только эти конкретные поля.
Это то, что может быть достигнуто? Если так, то как? Я очень озадачен тем, как это сделать.
Большое спасибо.

EDIT: Ладно, мне удалось это сделать, и парень, теперь быстро! Вот как я это сделал:

var customers = (from customer in Context.Cutomers
                select new
                {
                    customer.ID,
                    customer.FirstName,
                    customer.LastName,
                    Orders = customer.Orders.Select(order => new
                    {
                        order.ID,
                        order.NetPrice,
                        Products = order.Products.Select(product => new
                        {
                            product.ID
                        }
                    }
                })
                .AsEnumerable()
                .Select(c => new Customer 
                {
                    c.ID,
                    //In my case, this is VERY important as it will 
                    //try to convert from IEnumerable<T> to ICollection<T> 
                    //which seems to need to be explicit.
                    Orders = c.Orders as ICollection<Order> 
                })
                .ToList();

РЕДАКТИРОВАТЬ # 2: Я был не прав ... Компилируется нормально, все вроде работает, но мои продукты пусты ... Я снова в тупике ...

1 Ответ

0 голосов
/ 11 марта 2011

Вы можете использовать проекцию (на анонимный или подготовленный тип).Я не пробовал, но думаю, что-то вроде этого должно работать:

var query = from c in context.Customers
            select new 
              {
                 c.Id,
                 c.FirstName,
                 c.LastName,
                 Orders = c.Orders.Select(o =>
                   new OrderPartial
                     {
                       NetPrice = o.NetPrice,
                       ProductIds = o.Products.Select(p => p.Id) 
                     })
              };
...