Как вручную загрузить EntityReference без использования EntityReference.Load () - PullRequest
1 голос
/ 13 июня 2009

У меня есть тип объекта Order, который содержит ссылку на тип объекта Customer. Есть функция import, которая возвращает список Order на основе критериев. Этот список заказов отображается в таблице данных, которая показывает

Order.Date | Order.Customer.Name | Order.Total

Для отображения Customer.Name мне нужно загрузить CustomerReference в каждом Order в списке, но каждый вызов Order.CustomerReference.Load () должен был бы совершить двустороннее путешествие к SQL Server и сделать весь процесс очень неэффективным , Вопрос в том, если у меня есть один запрос, который извлекает все данные о клиентах для всех заказов в списке, как мне вручную заполнить ссылку CustomerReference в каждом заказе?

В основном мне нужно сделать .Include ("Клиент") с функцией импорта.

Спасибо

Ответы [ 2 ]

2 голосов
/ 14 июня 2009

Если вы выполняете запрос, который возвращает всех связанных клиентов за один раз, нет необходимости вручную заполнять каждую CustomerReference. Это потому, что что-то под названием Исправление отношений делает это для вас автоматически.

т.е. если вы сделаете это:

Order o = ctx.Orders.First(o => o.Customer.ID == 1);
// at this point o.Customer == null

Customer c = ctx.Customers.First(c => c.ID == 1);
// at this point o.Customer == c

Исправление отношений означает, что после того, как клиент входит в контекст, все связанные объекты будут автоматически указывать на него ...

т.е. это намного проще, чем вы думаете!

Надеюсь, это поможет

Alex

0 голосов
/ 14 июня 2009

Спасибо, Алекс, я попробовал это. Это работает, как вы сказали, но, очевидно, не работает с производным типом сущности. Тип сущности заказа - это абстрактный базовый класс, у которого есть производный класс Sale.

Order o1 = ctx.Orders.First(o => o.Customer.ID == 1); 
Sale s1 = ctx.GetSaleByCustomerID_FunctionImport(2).First(); 

Customer c = ctx.Customers.First(c => c.ID == 1); 
Customer c2 = ctx.Customers.First(c => c.ID == 2);
//At this point o.Customer == c but s1.Customer is still null 

И я не могу установить тип возвращаемого значения функции импорта как Order, потому что он абстрактный и не разрешен в качестве типа возвращаемого значения.

Что мне здесь не хватает?

Обновление: Я обнаружил, что есть разница между o1 и s1 до загрузки клиентов o1.CustomerReference.IsLoaded is False o1.CustomerReference.EntityKey is ID = 2

s1.CustomerReference.IsLoaded is False s1.CustomerReference.EntityKey имеет значение null

Но вызов s1.CustomerReference.Load () правильно загрузит данные клиента. Я дважды проверил мой импорт функции GetSaleByCustomerID (просто «SELECT * FROM Customers WHERE ID = 2»), он возвращает поле CustomerID, требуемое ссылкой.

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