Проблема производительности LINQ и SQL при работе с членством - PullRequest
0 голосов
/ 14 апреля 2010

Я использую членство в ASPNET с 50000 записями, и у нас есть еще одна таблица с именем "scm_Users", в которой есть ровно количество записей, они НЕ связаны ни одним ключом. У меня есть простой SQL:

select * from dbo.aspnet_Users a, dbo.scm_Users b
where a.UserName = b.UserName

Я могу получить 50000 записей менее чем за 1 секунду.

В LINQ, (используя Entity Framework), когда я пытаюсь сделать то же самое:

IEnumerable<MembershipUser> allMembershipUsers = Membership.GetAllUsers().Cast<MembershipUser>();
ObjectQuery<User> users = this.DataContext.UserSet;

var    result = (from a in allMembershipUsers
                      from b in users
                      where a.UserName == b.UserName
                 select new 
                 {
                   ..... 
                 }).AsEnumerable();

Когда я связал результат с Grid, он получил тайм-аут для 50000 записей. Когда я отлаживал его и размышлял над «представлением результатов», он тоже истекал. Конечно, если я использую Membership.FindUsersByName () и ограничу количество записей, он вернет результаты в любом случае.

И, если я связываю 50000 записей непосредственно в Grid без запроса членства, Grid также работает.

 var    result = (from b in users
                  select b).AsEnumerable();

Что я сделал не так?

нотабене

Ответы [ 3 ]

2 голосов
/ 14 апреля 2010

Что такое Membership? Мне кажется, что вы извлекаете данные из двух разных источников данных, которые загружают их в память и выполняют работу с наборами в памяти. Вы также часто используете приведения к тем, что кажутся довольно большими наборами данных.

Попробуйте что-то еще подобное:

var result = from a in DataContext.MembershipUsers
             join b in DataContext.UsersSet on a.UserName equals b.UserName
             select new { ... };
0 голосов
/ 14 апреля 2010

Одно существенное отличие состоит в том, что вы транслируете 100K записей вместо 50K. Запрос SQL объединит два результата на сервере и вернет 50К строк данных, объединенных между двумя таблицами. В вашем примере вы сбрасываете 50 КБ через GetAllUsers, а другие 50 КБ через UserSet. Суть в том, что если вы не запросите таблицу членства в aspnet напрямую через DataContext, вы не сможете этого избежать.

0 голосов
/ 14 апреля 2010

Я бы сказал, что замедление вызывает Cast, а не запрос. Попробуйте это без приведения и верните необработанные сущности, чтобы увидеть, ускоряет ли это вещи.

...