Linq с DataTable .ToList() очень медленный

fact.UnderlyingDataTable — это DataTable


var queryResults4 = //get all facts
    (from f in facts.UnderlyingDataTable.AsEnumerable()
        where f.RowState != DataRowState.Deleted &&
            FactIDsToSelect.Contains(f.Field<int>("FactID"))
        select f);

var queryResults5 = (from f in queryResults4.AsEnumerable()
    orderby UF.Rnd.Next()
    select f);


return queryResults5.ToList();

Проблема в этой строке queryResults5.ToList();

Он возвращает список DataRows. Но делает это очень медленно.

Я рад вернуть любой объект, который реализует IEnumerable. Что я должен делать? Мне кажется, что преобразование из любой переменной в List<DataRow> происходит медленно.

Спасибо за ваше время.


person Vincent Vandervaere    schedule 15.10.2013    source источник


Ответы (2)


Во-первых, медленный не сам ToList, а запрос, который выполняется в этом методе. Так что, возможно, ваш DataTable содержит много строк. Я также предполагаю, что FactIDsToSelect велико, что делает проверку Contains для каждой строки медленной.

Вы можете использовать CopyToDataTable для создания нового DataTable с той же схемой вместо List, так как это более естественно для IEnumerable<DataRow>. Однако, как я уже упоминал, это не решит вашу проблему с производительностью.

Вы можете оптимизировать запрос с помощью Join, что намного эффективнее:

var q =   from row in UnderlyingDataTable.AsEnumerable()
          where row.RowState != DataRowState.Deleted 
          join id in FactIDsToSelect
          on row.Field<int>("FactID") equals id
          select row;
var newTable = q.CopyToDataTable();

Почему LINQ JOIN намного быстрее, чем связывание с ГДЕ?

person Tim Schmelter    schedule 15.10.2013
comment
Здорово, что кажется намного быстрее! Спасибо за вашу помощь. - person Vincent Vandervaere; 15.10.2013
comment
@VincentVandervaere: Тогда подумайте о том, чтобы принять ответ. - person Tim Schmelter; 15.10.2013
comment
Просто ради интереса, сколько времени это занимало раньше и сколько времени занимает сейчас? - person Tim Schmelter; 15.10.2013
comment
Я действительно не время это. Но я бы сказал как минимум в 4 раза быстрее. - person Vincent Vandervaere; 15.10.2013

Пожалуйста, попробуйте следующее.

List<DataRow> list = new List<DataRow>(UnderlyingDataTable.Select("FactID = " + id.ToString(),DataViewRowState.Unchanged));

Возможно, вам потребуется изменить аргумент DataViewRowState в методе .Select.

person mit    schedule 15.10.2013
comment
Я присоединился к запросу с помощью FactIDsToSelect, и теперь это чертовски быстрее. Спасибо за ваше время. - person Vincent Vandervaere; 15.10.2013