Entity Framework. Просмотр возвратных дубликатов записей
Я использую Entity Framework, который содержит представление. И у меня есть запрос:
var data = this.context.vwRevenues
.Where(x => x.revenue >= 0);
.OrderByDescending(x => x.year)
.ThenByDescending(x => x.month)
.Take(10)
.ToList();
Этот запрос возвращает набор объектов, но 1-й объект равен 5-м.
data[0] == data[4] // true
Я беру sql script для этого запроса из sql tracer и запускаю его в SQL Management Studio,
он возвращает разные записи.
Ответы
Ответ 1
В соответствии с @Giovane Ответ
У нас была та же проблема в нашей системе с Entity Framework, которая касается представлений. Попробуйте использовать ROW_NUMBER() OVER() SQL, чтобы создать столбец с уникальными значениями, но не работал.
Я сделал то же самое, но чтобы он работал, мне нужно открыть модель EDMX, а затем выбрать этот столбец как Entity Key.
![enter image description here]()
Тогда он будет работать
Есть очень хорошая статья об этом
Дублирующие записи
Самые важные статьи:
При включении представления в вашу модель сущности модель, похоже, просто использует первые столбцы с недействительными значениями как первичный ключ (так как все столбцы, используемые в первичном ключе, должны быть недействительными).
Ответ 2
Вам нужно только сделать: context.viewname.AsNoTracking().Where(x => x.ColumnName != null);
Ответ 3
У нас была та же проблема в нашей системе с Entity Framework, которая касается представлений. Попробуйте использовать ROW_NUMBER() OVER() SQL, чтобы создать столбец с уникальными значениями, но не сработал.
Нам нужно вставить поле больше, FK для другой таблицы в представлении, чтобы он мог добавить в качестве дополнительного обучения для mebro EntityKeyMembers Elimite и, следовательно, проблему повторения.
Таким образом, если проблема сохраняется в подобной ситуации, решение заключается в том, чтобы вставить столбец FK, чтобы он был ЧЕМПИОНАМИ полей, которые формируют EntityKey таблицы.
Ответ 4
В представлении попробуйте преобразовать первую запись в ненулевое значение, например:
isnull(ROW_NUMBER() OVER (ORDER BY "Column"), 0) AS Row
Он указывает на Entity Framework, который может быть основным ключом автоматически.
Ответ 5
Если вы не хотите обновлять edmx и устанавливать любой ключ в столбце &&
если вы не хотите обновлять запись о просмотре (только для получения записи), используйте ниже код, который работает для меня.
context.viewname.MergeOption = System.Data.Objects.MergeOption.NoTracking;
context.viewname.Where(x => x.columnname != null);