Подтвердить что ты не робот

Имеет ли значение, когда вызывается 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();

Мне нравится добавлять его в конец операторов, но до того, как ToList вызывается вот так:

var matchingCustomers = context.Customers.Where(n => n.city == "Milan").Skip(50).Take(100).OrderBy(n => n.Name).AsNoTracking().ToList();
4b9b3361

Ответ 1

Нет, это не имеет значения: (источник)

Новый запрос с использованием NoTracking или исходный запрос, если NoTracking не поддерживается.

Итак, вы либо делаете это в начале, либо расширяете "новый" запрос с помощью цепочки методов, или вы делаете это в конце, а затем получаете "новый" запрос. Если вы назовете его до выполнения запроса, вы в порядке.

Ответ 2

Я думаю, что

var matchingCustomers = context.Customers.Where(n => n.city == "Milan").Skip(50).Take(100).OrderBy(n => n.Name).ToList().AsNoTracking();

имеет значение, потому что вы пытаетесь применить NoTracking к структуре данных, уже имеющейся в памяти после того, как EF выполнил и выполнил запрос запроса.

Когда вы используете этот свободный API; вы определяете запрос без его выполнения, пока вы, конечно, не выполните запрос. ToList() выполнит запрос, принеся данные в память, чтобы преобразовать его в структуру данных List<T>.

Разделите команду, чтобы понять это:

  • context.Customers → Выберите [*] для клиентов
  • Где (n = > n.city == "Милан" ) → Выберите [*] у Клиентов, где город == 'Милан'
  • Пропустить (50).Take(100) → Выбрать [*] у Клиентов, где город == 'Милан' OFFSET 50 ROWS FETCH NEXT 100 ROWS ONLY
  • Имя OrderBy → Выберите [*] у Клиентов, где город == 'Милан' OFFSET 50 ROWS FETCH NEXT 100 ROWS ONLY ORDER BY name
  • ToList() → Выполнить запрос и перенести данные в память с помощью отслеживания по умолчанию!
  • AsNoTraking() → Не делает ничего, потому что EF уже выполнил запрос и отслеживал данные.