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

Почему метод Find генерирует запрос TOP (2)?

Я использую Entity Framework 6.1, и у меня есть такой код:

Brand b;
using(var ctx = new KokosEntities())
{
      try
      {  
          b = ctx.Brands.Find(_brands[brandName].Id);
          return b;
      }
      catch (Exception ex)
      {
           _logger.Log(LogLevel.Error, ex);
      }
 }

И это генерирует:

 N'SELECT TOP (2) 
[Extent1].[Id] AS [Id], 
[Extent1].[Name] AS [Name], 
[Extent1].[OpenCartId] AS [OpenCartId]
FROM [dbo].[Brands] AS [Extent1]
WHERE [Extent1].[Id] = @p0',N'@p0 int'

Find метод возвращает единственный результат, но вместо 1 генерирует запрос TOP(2). Почему?

Примечание. Я уверен, что передаю метод Id методу, и да, Id является первичным ключом.

4b9b3361

Ответ 1

Если вы посмотрите на документацию для DbSet<TEntity>.Find Method:

Находит объект с указанными значениями первичного ключа.

Я заглянул в исходный код для метода Find и нашел:

/// <exception cref="T:System.InvalidOperationException">Thrown if multiple entities exist in the context with the primary key values given.</exception><exception cref="T:System.InvalidOperationException">Thrown if the type of entity is not part of the data model for this context.</exception><exception cref="T:System.InvalidOperationException">Thrown if the types of the key values do not match the types of the key values for the entity type to be found.</exception><exception cref="T:System.InvalidOperationException">Thrown if the context has been disposed.</exception>
    public virtual TEntity Find(params object[] keyValues)
    {
      return this.GetInternalSetWithCheck("Find").Find(keyValues);
    }

поэтому метод будет вызывать InvalidOperationException в случае нескольких объектов.

Брошено, если в контексте с несколькими ключевыми словами существует несколько объектов значения, указанные

Внутренний вызов Find не преобразуется в Single/SingleOrDefault; вместо этого простой цикл используется для проверки нескольких объектов.

Поскольку метод специфичен для первичного ключа, он должен генерировать исключение в случае нескольких объектов. Вот почему он генерирует запрос для выбора не менее двух записей. Аналогично вызову Single.

Ответ 2

Я предполагаю под обложками, которые преобразуются в вызов Single или что-то похожее на него. В этом случае LINQ хочет убедиться, что есть только 1 результат. Если возвращено 2 записи, они могут бросить.