LINQ - .Cast <T>() выбирает записи? - PullRequest
4 голосов
/ 10 апреля 2009

Я заметил, что определенная команда заставляет LINQtoSQL подключаться к базе данных и загружать записи, которые являются частью запроса, например .ToArray ().

Приводит ли команда .Cast () к выполнению запроса (и как я могу рассказать об этом в будущем?). Например ...

IRevision<T> current = context.GetTable(typeof(T))
    .Cast<IRevision<T>>()
    .SingleOrDefault(o => o.ID == recordId);

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

Ответы [ 3 ]

7 голосов
/ 10 апреля 2009

От Enumerable.Cast () Замечания:

Этот метод реализован с использованием отложенного выполнения. Немедленное возвращаемое значение - это объект, в котором хранится вся информация, необходимая для выполнения действия. Запрос, представленный этим методом, не выполняется до тех пор, пока объект не будет перечислен путем непосредственного вызова его метода GetEnumerator или использования foreach в Visual C # или For Each в Visual Basic.

Все операторы LINQ сообщат вам, являются ли они отложенным или немедленным выполнением запроса. Кроме того, вот стандартные операторы LINQ, которые НЕ откладываются:

  • Совокупный
  • Все
  • Любой
  • Средний
  • Содержит
  • Count
  • ElementAt
  • ElementAtOrDefault
  • Первый
  • FirstOrDefault
  • Последний
  • LastOrDefault
  • LongCount
  • Макс
  • Min
  • SequenceEqual
  • Single
  • SingleOrDefault
  • Сумма
  • ToDictionary
  • ToList
  • ToLookup
3 голосов
/ 10 апреля 2009

Нет, это не так. Он просто выполняет приведение, когда вы перебираете IEnumerable.

Нет определенного способа (в коде) узнать, будет ли метод использовать отложенное выполнение или нет. Документация будет вашим лучшим другом здесь, так как она скажет вам, откладывает ли она выполнение или нет.

Однако это не означает, что вы не можете делать некоторые предположения, если документация неясна.

Если у вас есть метод, который возвращает другой список / структуру (например, ToList, ToArray), он должен будет выполнить запрос, чтобы заполнить новую структуру данных.

Если метод возвращает скалярное значение, он должен выполнить запрос для генерации этого скалярного значения.

Кроме этого, если он просто возвращает IEnumerable<T>, то он более чем вероятно откладывает выполнение. Однако это не означает, что это гарантировано, это просто означает, что это более чем вероятно.

0 голосов
/ 10 апреля 2009

То, что вы ищете, называется «отложенное выполнение». Операторы, которые откладывают выполнение, выполняются только при попытке доступа к данным. Операторы типа ToList выполняются немедленно, так как данные необходимы для преобразования их в список.

Приведение может ждать, пока вы на самом деле не получите к нему доступ, так что это отложенный оператор.

...