Почему Distinct with Entity Framework не делает «DISTINCT» на SQL Server? - PullRequest
2 голосов
/ 17 ноября 2011

Я только недавно переключил наш репозиторий и контекст с Linq-to-SQL на Entity Framework 4.1 CodeFirst.

В настоящий момент все мои модульные тесты проходят, кроме одного!И именно он проверяет, получаю ли я отчетливый результат из SQL-представления.

var query = worker.ObjectRepository.GetFreeObjects();
query = query.Distinct();
return query;

Когда я проверяю запрос непосредственно перед вызовом .Distinct (), запрос корректен и работает нормально.когда я выполняю его вручную на SQL Server.

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

Если я вручную добавлю DISTINCT в свой запрос SQL,это работает нормально, но вызов .Distinct() в коде не делает этого.

Почему это так?

Редактировать

public IQueryable<SearchResultValueObject> GetFreeObjects()
{
    return Get(Context.FreeObjects)
}

public IQueryable<TEntity> Get<TEntity>(IQueryable<TEntity> query)
{
    return query;
}

Я просто немного удивился этому сценарию, который является всем, что происходит.Получение данных из контекста и их возврат.

Вот так выглядит мой контекст

public class MyContext : DbContext, IMyContext
{
    public virtual DbSet<SearchResultValueObject> SearchResult { get; set; }

    IQueryable<SearchResultValueObject> IMyContext.FreeObjects { get { return this.SearchResult; } }
}

Я также пытался удалить все, кроме objectNo, из файла SearchResultMap, я получилрезультаты из БД, но .Distinct() не сработало.

Edit2

Я сделал простой пример, в котором есть та же проблема: http://pastebin.com/sYVfNb0YЭто как-то связано с тем, что я выбираю из представления?Или я здесь что-то упускаю?

С уважением, Джеспер

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

Одна возможность состоит в том, что ваш запрос содержит столбец, который гарантированно будет отличаться, и EF знает, что ему не нужно включать DISTINCT в сгенерированный SQL.

Я проверил это с помощью LINQPad и EF 4.1,Модель, с которой я тестировал, является первой моделью БД - я не думаю, что это имеет значение, но решил, что должен упомянуть об этом.

Когда запрос включает столбец PK, EF генерирует тот же SQL, когда .Distinct()

Когда я изменяю запрос на выбор только столбца без PK, я вижу, что DISTINCT появляется в SQL при вызове .Distinct().

0 голосов
/ 18 ноября 2011

Я был бы рад, если бы кто-нибудь нашел способ обойти это. Но после нескольких часов осмотра все это пришло ко мне , создавая новый взгляд на основе старого .

Я не знаю, правильно ли это делать, но это помогло мне решить мою проблему.

...