Имеет ли значение, где вызывается AsNoTracking в Entity Framework
имеет ли значение, где вызывается метод AsNoTracking при написании запроса Entity Framework? например,
var matchingCustomers = context.Customers.AsNoTracking().Where(n => n.city == "Milan").Skip(50).Take(100).OrderBy(n => n.Name).ToList();
var matchingCustomers = context.Customers.Where(n => n.city == "Milan").AsNoTracking().Skip(50).Take(100).OrderBy(n => n.Name).ToList();
var matchingCustomers = context.Customers.Where(n => n.city == "Milan").Skip(50).AsNoTracking().Take(100).OrderBy(n => n.Name).ToList();
var matchingCustomers = context.Customers.Where(n => n.city == "Milan").Skip(50).Take(100).AsNoTracking().OrderBy(n => n.Name).ToList();
var matchingCustomers = context.Customers.Where(n => n.city == "Milan").Skip(50).Take(100).OrderBy(n => n.Name).AsNoTracking().ToList();
var matchingCustomers = context.Customers.Where(n => n.city == "Milan").Skip(50).Take(100).OrderBy(n => n.Name).ToList().AsNoTracking();
мне нравится добавлять его в конце заявления, но до список называется так:
var matchingCustomers = context.Customers.Where(n => n.city == "Milan").Skip(50).Take(100).OrderBy(n => n.Name).AsNoTracking().ToList();
2 ответов
нет, это не имеет значения: (источник)
новый запрос с NoTracking применяется, или исходный запрос, если NoTracking не поддерживается.
таким образом, вы либо делаете это в начале, и вы расширяете "новый" запрос с цепочкой методов, либо вы делаете это в конце, а затем получаете "новый" запрос. До тех пор, пока вы называете это перед выполнением запроса ты в порядке.
думаю, что
var matchingCustomers = context.Customers.Where(n => n.city == "Milan").Skip(50).Take(100).OrderBy(n => n.Name).ToList().AsNoTracking();
имеет значение, потому что вы пытаетесь применить NoTracking к структуре данных, уже находящейся в памяти, как только EF выполнил и обработал запрос.
когда вы используете этот fluent API; вы определяете запрос без его выполнения, пока вы, конечно, не выполните запрос. ToList()
выполнит запрос и приведет данные в память, чтобы преобразовать его в List<T>
структуры данных.
давайте разделим команду, чтобы понять это:
- контексте.Клиенты -- > Выберите [ * ] от клиентов
- где (n => n.city = = "Milan") -- > выберите [*] у клиентов, где город = = "Милан"
- пропустить(50).Take (100) --> Select [*] from Customers where city = = 'Milan' СМЕЩЕНИЕ 50 СТРОК ПОЛУЧИТЬ СЛЕДУЮЩИЕ 100 СТРОК ТОЛЬКО
- имя OrderBy -- > выберите [*] из клиентов, где city = = 'Milan' Смещение 50 строк получить следующие 100 строк только порядок по имени
- ToList () -- > выполнить запрос и вывести данные в память с отслеживанием по умолчанию!
- AsNoTraking () -- > ничего не делает, потому что EF уже выполнил запрос и отследил данные.