Объект Framework/LINQ к Привязке данных SQL используют отражение?

Здесь Student - это экземпляр ученика

delete Student.number;

// Пример 2

delete Student[number]; 

// Пример 3

delete Student["number"];

Вы можете удалить ключ объекта с приведенным выше примером. но имейте в виду, что ученик должен быть экземпляром, а не функциональным объектом

8
задан Rex M 2 May 2009 в 01:43
поделиться

3 ответа

API-интерфейс Expression, который лежит в основе LINQ и т. Д., Основан на отражении ( MemberInfo ), а не на модели компонента ( PropertyDescriptor и т. д.), поэтому нет большого требования для ITypedList . Вместо этого содержимое выводится из T в IQueryable , IEnumerable и IList и т. Д.

Самое близкое, что вы можете получить - это IListSource , но это все равно будет просто поверхностная оболочка вокруг правильного типизированного списка.

Если производительность привязки во время выполнения (до PropertyDescriptor ) является ключевым, вы можете посмотреть на HyperDescriptor - который использует Отражение. Emit и TypeDescriptionProvider , чтобы обернуть компонентную модель.

Re "почему" и т. Д .; обратите внимание, что почти во всех случаях с LINQ-to-SQL и EF выражение (или часть «создание и установка членов») будет скомпилировано с делегатом до его вызова - так что во время выполнения нет огромных затрат на отражение. И аналогично, с LINQ-to-Objects все уже уже скомпилировано (компилятором C #).

3
ответ дан 6 December 2019 в 00:08
поделиться

Если посмотреть на то, что MSDN говорит о привязке данных LINQ to SQL, то кажется, что использовать IListSource или IBindingList.

Кстати, LINQ использует Деревья выражений , и это не столько отражение, сколько метапрограммирование. Производительность должна быть намного лучше, чем отражение. Чарли Калверт освещает это немного в этой статье .

0
ответ дан 6 December 2019 в 00:08
поделиться

Из моего опыта работы с LINQ to SQL я пришел к выводу по нескольким причинам, что LINQ использует отражение для установки и получения значения полей в экземплярах класса сущностей. Я не знаю, смогу ли я вспомнить все причины, но вот что я могу вам сказать.

  1. Если я правильно помню, LINQ не вызывает никаких процедур свойств, но напрямую устанавливает и считывает все значения закрытых полей напрямую, что насколько я знаю, это можно сделать только с помощью отражения.
  2. Имена, предоставляемые MetaData (в атрибутах свойств класса сущности), предоставляют информацию об имени поля в виде строки (если столбец базы данных и имя свойства различны, например). Из этого можно сделать вывод, что LINQ должен использовать отражение для поиска члена, чтобы получить к нему доступ.

Я думаю, что это делает это для обеспечения простоты - вы можете полагаться на значения в полях в классе сущностей, непосредственно отражающих значения столбца базы данных, и нет особых накладных расходов при извлечении объекта из базы данных (заполнении вновь созданного сущность, соответствующая значениям, полученным из базы данных, не должна маршрутизироваться через процедуры свойств). Например, одна вещь, которую я сделал для представления перечисляемых значений, извлеченных из базы данных, - это сделать некоторые из сгенерированных LINQ свойств частными и обернуть их в закодированное вручную свойство в частичном классе, который читает и записывает свойство LINQ.

не требует больших затрат при извлечении объекта из базы данных (заполнение вновь созданного объекта в соответствии со значениями, полученными из базы данных, не должно проходить через процедуры свойств). Например, одна вещь, которую я сделал для представления перечисляемых значений, извлеченных из базы данных, - это сделать некоторые из сгенерированных LINQ свойств частными и обернуть их в закодированное вручную свойство в частичном классе, который читает и записывает свойство LINQ.

не требует больших затрат при извлечении объекта из базы данных (заполнение вновь созданного объекта в соответствии со значениями, полученными из базы данных, не должно проходить через процедуры свойств). Например, одна вещь, которую я сделал для представления перечисляемых значений, извлеченных из базы данных, - это сделать некоторые из сгенерированных LINQ свойств частными и обернуть их в закодированное вручную свойство в частичном классе, который читает и записывает свойство LINQ.

1
ответ дан 6 December 2019 в 00:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: