Одна из вещей, которые Вы победили в Вас как младший разработчик, - то, что Вы никогда не делаете "ВЫБОР *" на наборе данных, поскольку это ненадежно по нескольким причинам.
Начиная с отодвижения к Linq (во-первых Linq к SQL и затем Платформе Объекта), я задался вопросом, осужден ли эквивалентный Linq одинаково?
Например,
var MyResult = from t in DataContext.MyEntity
where t.Country == 7
select t;
Мы должны выбирать в анонимный тип только с полями, которые мы хотим явно упомянутый, или выгода является всем выбором, теперь приемлемым для LinqToSql и др. из-за дополнительного материала, окружающего данные, которые они обеспечивают?
С уважением
Мычание
Это не нахмущено, он определяется вашим применением. Если вы хотите обновить результат и сохранить его, то вы должны выбрать T
, однако, если вы не хотите делать это, и просто запросы для целей отображения вы можете сделать его более эффективным, выбрав его Хотите:
var MyResult = from t in DataContext.MyEntity
where t.Country == 7
select new { t.Prop1, t.Prop2 };
Это по нескольким причинам. Население анонимного типа немного быстрее, но что более важно его отключает отслеживание изменений ... потому что вы не можете сохранять анонимный тип, нет необходимости отслеживать изменения в этом.
Вот отличное подножение общих областей производительности, таких как это , это здорово при запуске. Он включает в себя более глубокое объяснение отслеживания изменений, которое я только что описал.
Вы все равно должны явно заявить, что вы хотите выбрать. Если вы выберете все, вы все еще выбираете гораздо больше данных, чем вам нужно, и по мере добавления новых вещей, вы излишне притягиваетесь. В общем, лучшая практика - тянуть только то, что вам нужно.
Возможно, вам следует явно передать запрос в StartFileHandler.
-121--4349538-Также (для Ника Крейвера пост) гораздо проще добавить новые перечисления.
Это поведение не является уникальным для перечислений. Рассмотрим следующее:
var list = new int[] { 1, 2, 3, };
-121--1174079- выберите t
в данном случае, выбрав все поля известного типа. Он отличается строгой типизацией и менее подвержен тем же ошибкам, что и в SQL.
Например, в SQL
INSERT INTO aTable
SELECT * FROM AnotehrTable
может произойти сбой при изменении AnotherTable
, однако в Linq/.Net эта ситуация не возникает.
Если вы присоединяетесь к нескольким таблицам, тогда вы не можете сделать select *
в Linq, вам придется создать анонимный тип со всеми типами, содержащимися в.
Я бы сказал, что вы делаете, является эквивалентом выбора *
. Лучше вернуть только поля, которые вам требуют E.g.
var myResult = from t in DataContext.MyEntity
where t.Country == 7
select new T
{
Field1 = t.Field1,
Field2 = t.Field2
}
Может быть необходимо сделать это, как в примере, особенно если то, что необходимо сделать, это изменение ряда (ов).
В SQL Select * отличается от LINQ, поскольку LINQ всегда будет возвращать одинаковое количество столбцов (как определено в DBML).
Ограничения по умолчанию являются емкостью вашего сервера для обслуживания этих запросов (I.E. CPU, память), хотя вы можете настроить дросселирование и т. Д. В зависимости от ряда одновременных пользователей.
-121--2134466-Использование LINQ не будет смягчать производительность попадания получения дополнительных полей.
Однако это невозможно для генерации SELECT * из ...
с использованием Linq к SQL.
Ваш код будет генерировать форму выбора
, что явно называет все столбцы, определенные в вашей модели; Это проигнорирует любые изменения в базе данных.
Однако производительность все еще является заботой, поэтому вы должны использовать анонимный тип, если вы используете только некоторые столбцы.
Причина избегания выбора * состоит в том, что базовая база данных может измениться и, следовательно, заказы столб могут измениться, что может привести к ошибкам в вашем уровне доступа к данным.
Вы не выполняете выбор * из вашей базы данных, вы просто говорите, что хотите «T» и все, что идет с ним. Нет ничего плохого в том, что если это действительно то, что вам нужно.