LINQ и отображение набора результатов в классе - PullRequest
1 голос
/ 29 апреля 2011

вот код

        var customers = db.ExecuteQuery<Customer>(@"SELECT CustomerID, CompanyName, ContactName, ContactTitle, 
   Address, City, Region, PostalCode, Country, Phone, Fax
   FROM   dbo.Customers
   WHERE  City = {0}", "London");

foreach (Customer c in customers)
   Console.WriteLine(c.ContactName);

код, выполнить sql и повторить запись клиента. мой вопрос, как результат может быть сохранен в классе клиента автоматически .... который я не понимаю. если вы видите эту строку кода db.ExecuteQuery<Customer> отсюда мы можем понять, что результат клиента будет возвращен, а данные клиента будут сохранены в классе клиента. как автоматически данные могут храниться и присваиваться нужному свойству в классе клиента, поскольку имя класса клиента CustomerID может быть CustID .... тогда что будет.

строка db.ExecuteQuery<Customer> очень сбивает меня с толку, и я просто не понимаю, будет ли создан новый экземпляр клиента с возвращенными данными клиента ... так что, пожалуйста, обсудите подробно.

1 Ответ

0 голосов
/ 29 апреля 2011

ExecuteQuery просто запускает произвольный SQL (после применения параметризации string.Format -esque) и затем материализует результаты IDataReader как последовательность объектов.

Обратите внимание, что сопоставления между mapped типами и db-столбцами / типами-членами хорошо определяются контекстом данных ( обычно через атрибуты на членах,но не всегда), но IIRC ExecuteQuery не не применяет эти сопоставления (я рад, что здесь я исправлюсь).Вы можете проверить это с помощью db.Mapping.GetMetaType(typeof(Customer)).

Основы здесь ничем не отличаются от того, если вы выполнили

var cust = db.Customers.ToList();

, за исключением того, что в версии db.Customers может применяться больше сопоставлений и т. Д.

Сама материализация (т. Е. Создание объекта и установка элементов) является примером рефлексии и метапрограммирования;большинство ORM и микро-ORM будут работать там примерно одинаково: проверять тип (Customer выше) и проверять поля в считывателе, а затем создавать на лету некоторый код (обычно кешируемый), который создаст новыйобъекты и установить членов.

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