#c# #entity-framework
#c# #entity-framework
Вопрос:
У меня есть таблица клиентов в БД, в которой хранятся имя, адрес и т.д., а также некоторые фотографии, логотип и другие изображения.
Я использую entity framework
, и я хотел бы знать, как справиться с ситуацией, когда я хочу вернуть только базовые данные о клиенте в определенных ситуациях по сравнению с полными данными, включая изображения.
Должен ли я иметь две сущности, CustomerBasic и CustomerComplete
или
создайте один объект Customer и заполните его двумя отдельными методами, FillBasic, FillComplete.
Какие-либо рекомендации? я новичок в EF.
Ответ №1:
Это действительно зависит от структуры вашего репозитория, если таковая имеется — с помощью самого EF вы можете просто использовать проекцию с нужными вам свойствами для экземпляра бизнес-объекта, который представляет «базового клиента», т.Е.
var customerBasicList = context.Customers
.Where(...)
.Select( c => new CustomerBasic()
{
FirstName = c.FirstName,
LastName = c.LastName,
}).ToList();
Производительность становится более важной, когда у вас есть свойство коллекции (например, изображения в вашем примере) в вашей сущности. В вашем случае вы можете воспользоваться отложенной загрузкой, чтобы материализовать эти свойства только тогда, когда и если это необходимо.
Комментарии:
1. на самом деле это не набор изображений, а отдельные столбцы с именами. Если я не запрашивал c.LogoFileName (следуя вашему примеру кода), он не вернет его из базы данных?
2. @AlexJ: Правильно — если вы используете такую проекцию, она будет сопоставлена с
select FirstName, LastName from ...
3. Могу ли я просто использовать объект Customer (с полями изображений) и с помощью проекции просто не загружать их. таким образом, это будет c => new Customer(), но я не загружаю изображения только по имени и адресу. Будет ли это работать так же? я пытаюсь избежать наличия двух объектов для одного и того же объекта, basic и full.
4. @AlexJ: Нет, к сожалению, вы не можете проецировать в объект с помощью EF
5. не могли бы вы прислать мне ссылку, где я могу прочитать об этом материале для проектирования?
Ответ №2:
Я думаю, что то, что вы хотите, может быть достигнуто путем проецирования запроса с помощью предложения select . Например (взято из этой статьи)
using(AdventureWorksDB aw = new
AdventureWorksDB(Settings.Default.AdventureWorks)) {
var newSalesPeople = from p in aw.SalesPeople
where p.HireDate > hireDate
orderby p.HireDate, p.FirstName
select new { Name = p.FirstName " " p.LastName,
HireDate = p.HireDate };
foreach(SalesPerson p in newSalesPeople) {
Console.WriteLine("{0}t{1}", p.FirstName, p.LastName);
}
}
Вы можете многое сделать с этим шаблоном.
Комментарии:
1. Анонимные типы хороши во многих случаях, но я должен упомянуть, что вы не можете вернуть результаты этой проекции или передать их другому методу без создания фактического класса для их хранения.
2. да, мне нужно было бы вернуть их другим методам, поэтому, вероятно, лучше создать класс с именем CustomerBasic.