2016-04-07 3 views
1

У меня есть пейджинг и я whant, чтобы выбрать количество в одном запросе с помощью простого SQL (EF7):EF основной пейджинг. Выберите общее количество в одном запросе

var selectSql = " SELECT TotalCount = COUNT(*) OVER(), E.* FROM [table] E ..."; 
var rows = context.Set<EventTable>().FromSql<EventTable>(selectSql, parameters.Select(p => p.Value).ToArray()).ToArray(); 

Это настоящих работы, но я не TOTALCOUNT недвижимости в моем EventTable class, потому что я не хочу этого свойства в базе данных.

Я пытаюсь получить TOTALCOUNT имущества от лица трекера:

var row = rows.First(); 
var entity = context.Entry(row); 
var totalCount = entity.Property<int>("TotalCount").CurrentValue; 

Но тогда я получаю ошибку: Свойства «TotalCount» от типа объекта «EventTable» не может быть найден. Убедитесь, что свойство существует и включено в модель.

Тогда я пытаюсь добавить свойство в модели следующим образом:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<EventTable>(b => b.Property<int>("TotalCount")); 
} 

Он отлично работает, когда я whant, чтобы выбрать, но он бросает исключение на вставке, так как столбец в базе данных не существует. И EF добавит эту колонку при миграции. Но я замечаю, что если до создания миграции я добавляю строку b.Property («TotalCount»); в класс ModelSnapshot он избежит добавления свойства при миграции. Но проблема с вставкой все еще существует.

Я пытаюсь создать еще один класс:

[NotMapped] 
public class EventSearchTable : EventTable 
{ 
    [Column("total_count")] 
    [Required] 
    public int TotalCount { get; set; } 
} 

, а затем сделать это:

var rows = context.Set<EventSearchTable>().FromSql<EventSearchTable>(..); 

Он работает на EF6, но не на EF7, я получил сообщение об ошибке: Значение не может быть пустым. Имя параметра: entityType Поскольку в моем DbContext нет объекта. Если я добавлю класс EventSearchTable в свой DbContext, тогда он будет ожидать столбцы, такие как дискриминатор и т. Д., И создаст таблицу в миграциях.

Любые идеи о том, как получить имущество TotalCount?

Извините, если мой английский сломан.

ответ

3

Следующий запрос получит счет и страницы результатов в одной поездки в базу данных

var query = context.Set<EventTable>(); 
var page = query.OrderBy(e => e.Id) 
       .Select(e => e) 
       .Skip(100).Take(100) 
       .GroupBy(e => new { Total = query.Count() }) 
       .FirstOrDefault(); 

if (page != null) 
{ 
     int total = page.Key.Total; 
     List<EventTable> events = page.Select(e => e).ToList(); 
} 
+2

Это потерпит неудачу, когда результирующий набор пуст, хотя (по крайней мере, в ядре EF). Страница не является нулевой, но имеет внутреннее исключение NullReferenceException. –

+1

Он не работает, когда набор результатов пуст. Любое решение для этого? –

Смежные вопросы