какие методы можно использовать для "закрытия" скомпилированного запроса.
Методы, которые возвращают последовательность, используют отложенное выполнение, если только метод не похож на ToXYZ
.Where
, Select
, Take
, Skip
, GroupBy
и OrderBy
и т. Д. Подпадают под это.Методы, которые возвращают один объект, вызывают выполнение запроса, например First
, Single
, ToList
и ToArray
, ToDictionary
, ToLookup
, Any
, All
и т. Д.подробнее: Linq - Какой самый быстрый способ узнать отложенное выполнение или нет?
Я знаю, что большинство людей используют либо .AsEnumerable (), либо .ToList (), но которыедругие методы работают так же?Могу ли я использовать .AsQueryable (), или это не работает?
Они все разные.У Джастина есть грандиозное объяснение.Вы также можете захотеть увидеть: В чем разница между .ToList (), .AsEnumerable (), AsQueryable ()? с хорошим ответом.
ВВ общем, вы можете понять семантику метода, увидев имя самого метода.Метод с именем AsSomething
подразумевает, что он ничего не делает, но возвращает ввод как нечто .Это может включать или не включать возвращение нового объекта, но ссылка как-то поддерживается.Например, List<T>.AsEnumerable()
просто выполняет приведение к IEnumerable<T>
(конечно, это имеет большее значение в контексте linq).Вы можете привести его обратно к List<T>
и изменить его, отражая изменения повсюду.Чтобы проверить это:
var list = new List<int> { 1, 2 };
var enum = list.AsEnumerable();
var newlist = enum as List<string>;
newlist.Add(3);
//print enum.Count() -> 3
Хотя методы выглядят как ToSomething
, вы получаете совершенно новый объект, часто преобразуемый во что-то другое.
var list = new List<int> { 1, 2 };
var newlist = list.ToList();
newlist.Add(3);
//print list.Count -> 2
Давайте рассмотрим что-то вне контекста linq.object.ToString()
приводит к новому представлению строки (строки в любом случае неизменны, так что это немного бессмысленно).Интересная семантика - это List<T>.AsReadonly
, которая возвращает новый ReadOnlyCollection<T>
экземпляр, но изменение списка за его пределами также изменяет внутренний список ReadOnlyCollection<T>
, поэтому имя AsReadonly
.
var list = new List<int> { 1, 2 };
var readonlylist = list.AsReadonly();
list.Add(3);
//print readonlylist.Count -> 3