IQueryable.Выберите для списка типа sub POCO

#entity-framework #iqueryable

#entity-framework #iqueryable

Вопрос:

У меня есть модель Entity Framework, в которой есть таблица «Клиенты» и «Телефоны клиентов». У клиента может быть несколько телефонных номеров, поэтому у объекта «Customer» есть коллекция «Phone». Я могу запросить модель без проблем :

 using (CustomerEntities context = new CustomerEntities())
{
    Customer customer = context.Customers.FirstOrDefault();
    CustomerPhone phone = customer.Phones.FirstOrDefault();

    MessageBox.Show(customer.Name   " "   phone.Number);
}
  

Модель слишком сложна для того, что мне нужно сделать (хотя мой пример является базовым), поэтому я пытаюсь свести ее к более простым POCOs. Вот 2 простых класса :

 public class SimplePhone
{
    public int Id { get; set; }
    public string Number { get; set; }
}

public class SimpleCustomer 
{
    public int Id { get; set; }
    public string Name { get; set; }

    //Phones is a list because a single Customer can have multiple phone numbers
    public List<SimplePhone> Phones { get; set; }
}
  

Я могу заполнить простые свойства объекта, используя метод «Select» из «IQueryable» :

 using (CustomerEntities context = new CustomerEntities())
{
   IQueryable<SimpleCustomer> customers = context.Customers.Select(
           c => new SimpleCustomer
           {
               Id = c.Id,
               Name = c.Name
           }
       );

   SimpleCustomer customer = customers.FirstOrDefault();

   MessageBox.Show(customer.Name);
}
  

Итак, мой вопрос довольно прост: как я могу заполнить свойство «Телефоны», которое является списком?

 using (CustomerEntities context = new CustomerEntities())
{
   IQueryable<SimpleCustomer> customers = context.Customers.Select(
           c => new SimpleCustomer
           {
               Id = c.Id,
               Name = c.Name
               Phones = ///????
           }
       );

   SimpleCustomer customer = customers.FirstOrDefault();
   SimplePhone phone = customer.Phones.FirstOrDefault();

   MessageBox.Show(customer.Name   " "   phone.Number);
}
  

Дайте мне знать, если я неясен и / или вам нужна дополнительная информация.

Спасибо!

Ответ №1:

Я не уверен, что в вашем вопросе нет чего-то большего, но, насколько я понимаю, вы можете просто вызвать ToList , и это будет материализовано в виде списка:

 IQueryable<SimpleCustomer> customers = 
    context.Customers.Select(c => new SimpleCustomer
    {
        Id = c.Id,
        Name = c.Name,
        Phones = c.Phones.Select(p => new SimplePhone 
                 {
                     Id = p.Id, // Unless you want the custom Id, i.e. c.Id
                     Number = p.Number
                 }).ToList();
    });
  

Комментарии:

1. Да, это было так (я уверен, что сейчас чувствую себя немного глупо). Решение не работает для моего реального проекта, но, по крайней мере, я могу начать копать дальше, зная, что это работает. Спасибо!

2. @SteveRiley Это случается со всеми нами!