2013-11-21 2 views
0

У меня есть этот запрос, он выбирает много записей пользователя из таблицы. Этот блок кода занимает 16 секунд от моей локальной/отладочной машины (больше, чем 5 в производстве). Все, что я делаю, чтобы сделать это более эффективным, удваивает время, которое метод принимает для возврата результатов. Ниже приведены примеры других вещей, которые я пробовал. Я не понимаю, как выбрать анонимный тип и иметь дополнительную среднюю секцию, повторяющуюся через анонимный тип, возможно, быстрее, чем без.Почему этот запрос linq с анонимным типом быстрее, чем что-либо еще, я пытаюсь?

Этот блок занимает 16 секунд:

List<BoAssetSecurityUser> userList = new List<BoAssetSecurityUser>(); 
using (var context = DataObjectFactory.CreateContext()) 
{ 

    var query = from ui in context.User_Information 
       where (ui.AssetCustomerID == 1 && 
          (ui.GlobalID != "1TPTEMPUSER" || 
          ui.GlobalID == null)) 
       select new { ui }; 
    var result = 
    from q in query 
    select new 
    { 
     UserId = q.ui.UserID, 
     FirstName = q.ui.FirstName, 
     LastName = q.ui.LastName, 
     UserName = q.ui.Username, 
     Globalid = q.ui.GlobalID 

    }; 
    foreach (var user in result) 
    { 
     BoAssetSecurityUser boAssetSecUser = new BoAssetSecurityUser(); 
     boAssetSecUser.UserId = user.UserId; 
     boAssetSecUser.FirstName = user.FirstName; 
     boAssetSecUser.LastName = user.LastName; 
     boAssetSecUser.UserName = user.UserName; 
     boAssetSecUser.GlobalId = user.Globalid; 
     userList.Add(boAssetSecUser); 
    } 
} 
return userList; 

Это занимает более 45 секунд, чтобы завершить:

List<BoAssetSecurityUser> userList = new List<BoAssetSecurityUser>(); 
using (var context = DataObjectFactory.CreateContext()) 
{ 

    var query = (from ui in context.User_Information 
       where (ui.AssetCustomerID == 1 && 
          (ui.GlobalID != "1TPTEMPUSER" || 
          ui.GlobalID == null)) 
       select ui).ToList(); 
    foreach (var user in query) 
    { 
     BoAssetSecurityUser boAssetSecUser = new BoAssetSecurityUser(); 
     boAssetSecUser.UserId = user.UserID; 
     boAssetSecUser.FirstName = user.FirstName; 
     boAssetSecUser.LastName = user.LastName; 
     boAssetSecUser.UserName = user.Username; 
     boAssetSecUser.GlobalId = user.GlobalID; 
     userList.Add(boAssetSecUser); 
    } 
} 
return userList; 

Этот пример также занимает более 45 секунд, чтобы завершить:

List<BoAssetSecurityUser> userList = new List<BoAssetSecurityUser>(); 
using (var context = DataObjectFactory.CreateContext()) 
{ 

    var query = from ui in context.User_Information 
     where (ui.AssetCustomerID == 1 && 
        (ui.GlobalID != "1TPTEMPUSER" || 
        ui.GlobalID == null)) 
       select new { ui }; 

    foreach (var user in query) 
    { 
     BoAssetSecurityUser boAssetSecUser = new BoAssetSecurityUser(); 
     boAssetSecUser.UserId = user.ui.UserID; 
     boAssetSecUser.FirstName = user.ui.FirstName; 
     boAssetSecUser.LastName = user.ui.LastName; 
     boAssetSecUser.UserName = user.ui.Username; 
     boAssetSecUser.GlobalId = user.ui.GlobalID; 

     userList.Add(boAssetSecUser); 
    } 
} 
return userList; 
+0

Сколько полей у вас есть в 'User_Information', кажется, вы выбираете только ограниченные поля анонимного типа – Habib

+0

является user_information типа BoAssetSecurityUser? – terrybozzio

ответ

5

Это, скорее всего, потому, что у ui 's type больше объектов, чем интересующие вас. Анонимный тип new { ui } не нужен; ваш первый пример быстрее, потому что вы говорите ему, прежде чем перебирать список (и, следовательно, переходите к БД), который вас интересует только в этих 5 полях. В других примерах вы перебираете список, таким образом вытаскивая целые объекты ui, хотя вы используете только 5 его свойств.

Этот код должен тянуть только 5 свойств, и так быть не так быстро, как ваш первый пример, в то же время более кратким:

List<BoAssetSecurityUser> userList = new List<BoAssetSecurityUser>(); 
using (var context = DataObjectFactory.CreateContext()) 
{ 
    var query = from ui in context.User_Information 
       where (ui.AssetCustomerID == 1 && (ui.GlobalID != "1TPTEMPUSER" || ui.GlobalID == null)) 
       select new 
       { 
        ui.UserID, 
        ui.FirstName, 
        ui.LastName, 
        ui.Username, 
        ui.GlobalID 
       }; 

    foreach (var user in query) 
    { 
     BoAssetSecurityUser boAssetSecUser = new BoAssetSecurityUser(); 
     boAssetSecUser.UserId = user.UserID; 
     boAssetSecUser.FirstName = user.FirstName; 
     boAssetSecUser.LastName = user.LastName; 
     boAssetSecUser.UserName = user.Username; 
     boAssetSecUser.GlobalId = user.GlobalID; 
     userList.Add(boAssetSecUser); 
    } 
} 
return userList; 
+0

Я понимаю, что средняя секция, повторяющаяся через анонимный тип, фактически выполняет запрос и только выбирает нужные поля. Да, у него есть несколько колонок - ваша настройка сбрила 2 секунды, это было полезно. Спасибо! – TheRedDwarf

1

Это больше о количестве данных, которые вы получаете из базы данных. Первый запрос выбирает только несколько столбцов, а остальные - все.

У вас есть большие столбцы на этом столе?

1

Это быстрее, потому что вы запрашиваете только 5 свойств в каждой строке с анонимного типа , Я не сейчас, сколько полей у вас есть в User_Information, но они все взяты, когда вы используете .ToList() по вашему запросу, вероятно, вы получите гораздо больше данных, чем нужно.

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