Первый статистический столбец базы данных Entity Framework с активной загрузкой

1

Сначала я использую базу данных Entity Framework 6.x и базу данных SQL Azure.

У меня есть таблица данных по исследованиям и отдельная таблица респондентов. В моем дизайнере EF у меня есть организация "Объекты исследований" и "Субъекты респондентов", а "Объект исследований" имеет навигационное свойство для респондентов. В каждом исследовании могут быть тысячи респондентов, и есть сотни исследований.

Моя проблема в том, что я пытаюсь создать вычисляемый столбец в таблице исследований, содержащий COUNT респондентов, и я пытаюсь загрузить это значение. Причина, по которой мне нужна активная загрузка, заключается в том, что я заполняю DataGrid (WPF) списком исследований, а одним из столбцов моей сетки является RespondentCount. Если я не хочу загружать это значение, то прокрутка в моей сетке данных является janky, поскольку RespondentCounts ленивы загружаются, когда пользователь прокручивает сетку.

Я могу, конечно, с нетерпением ждать всех респондентов, использующих это выражение:

ctx.Studies.Include(s => s.Respondents)

а затем сделайте.COUNT() в свойстве "Свойства респондентов", но потом я загружу тысячи респондентов за исследование, что является огромным хитом производительности и огромной потерянной памятью, потому что все, что мне нужно, это COUNT.

Мне действительно нужно:

ctx.Studies.Include(s => s.Respondents.Count)

Но это не работает.

Я попытался настроить базу данных VIEW, которая содержит таблицу исследований с простым вычисленным полем для RespondentCount, но VIEW читается только в Entity Framework, и я теряю все мои отношения с внешним ключом в таблице "Исследования", когда я привожу VIEW в конструктор EF,

Как я могу загрузить это совокупное значение, загруженное без необходимости загрузки всех респондентов?

Теги:
sql-server
entity-framework
entity-framework-6

2 ответа

2
Лучший ответ

шаги:

  1. Создайте пользовательскую функцию SQL, которая учитывает респондентов путем изучения.
  2. Создайте вычисленный столбец в таблице " Studies чтобы использовать эту новую функцию.
  3. В вашем EF-сопоставлении добавьте этот новый вычисляемый столбец и установите свойство HasDatabaseGeneratedOption с параметром DatabaseGeneratedOption.Computed.

Некоторый потенциальный код с моими собственными тестовыми таблицами

create table respondents (id int, study_id int)

create function dbo.CountRespondents (@id int)
  returns int
as
begin
  return (select count(1) from respondents  where study_id = @id)
END

create table studies (id int, name varchar(50), respondents as dbo.CountRespondents(id))

insert into respondents values (1, 1)
insert into respondents values (2, 1)
insert into respondents values (3, 1)
insert into respondents values (4, 2)
insert into respondents values (5, 2)

insert into studies values (1, 'Study 1')
insert into studies values (2, 'Study 2')

select * from studies

Код EF

ctx.Studies.Property(s => s.Respondents).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);

Вместо Include используйте Property.

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

  • 0
    Потрясающие! Узнавайте что-то новое каждый день. Спасибо!
0

http://msdn.microsoft.com/en-us/data/jj574232.aspx

Иногда полезно знать, сколько объектов связано с другим объектом в базе данных, фактически не прибегая к загрузке всех этих объектов. Для этого можно использовать метод Query с методом LINQ Count. Например:

using (var context = new BloggingContext()) 
{ 
    var blog = context.Blogs.Find(1); 

    // Count how many posts the blog has  
    var postCount = context.Entry(blog) 
                          .Collection(b => b.Posts) 
                          .Query() 
                          .Count(); 
}
  • 0
    Но это, похоже, не решает проблему активной загрузки. Мне нужно знать количество респондентов для каждого исследования в таблице исследований, когда я загружаю таблицу исследований.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню