#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 Это случается со всеми нами!