2013-06-12 3 views
1

Я выполняю операцию объединения в LINQ для двух таблиц, но большую часть времени занимает выполнение для небольшого набора данных. Ниже запроса LINQЭффективный запрос соединения в LINQ

for (int i = 0; i <= 200; i++) 
{ 
     var test = from r1 in dtRowForNode.AsEnumerable() 
       join r2 in dtFileRowForNode.AsEnumerable() 
       on r1.Field<int>("Lng_Upload_Id") equals r2.Field<int>("Lng_Upload_Id") 
       where ((r1.Field<string>("Txt_Called_Number") == "999") || r1.Field<string>("Txt_Calling_Number") == "888") 
       select r2.Field<string>("Txt_File_Name"); 

     string[] str = test.Distinct().ToArray();     
} 

Вот у меня есть два DataTables dtRowForNode, что имеет около 7500 строк и другой является dtFileRowForNode, который имеет только 12 строк.

Теперь я собираюсь выполнить цикл этого запроса 200 раз, для завершения цикла for требуется почти 6-7 секунд. Почему это занимает столько времени для такого небольшого набора данных.

Должен ли я писать это по-другому?

+1

Вы действительно нуждаетесь в 'AsEnumerable()'? –

+0

@MatthewWatson Я не мог получить вашу точку зрения! –

+0

AsEnumerable() проходит через каждый элемент и добавляет его в переменную Enumerable. –

ответ

1

Смотрите, если следующие работает быстрее для вас:

var rowForNode=dtRowForNode.AsEnumerable().Select(dt=>new { 
    Lng_Upload_Id=dt.Field<int>("Lng_Upload_Id"), 
    Txt_Called_Number=dt.Field<string>("Txt_Called_Number"), 
    Txt_Calling_Number=dt.Field<string>("Txt_Calling_Number")}).ToList(); 

var fileRowForNode=dtFileRowForNode.AsEnumberable().Select(dt=>new { 
    Lng_Upload_Id=dt.Field<int>("Lng_Upload_Id"), 
    Txt_File_Name=dt.Field<string>("Txt_File_Name")}).ToList(); 

for (int i = 0; i <= 200; i++) 
{ 
     var test = from r1 in rowForNode 
       join r2 in fileRowForNode 
       on r1.Lng_Upload_Id equals r2.Lng_Upload_Id 
       where (r1.Txt_Called_Number == "999" 
        || r1.Txt_Calling_Number == "888") 
       select r2.Txt_File_Name; 

     string[] str = test.Distinct().ToArray();     
} 
+0

Тот же результат. Никаких изменений в производительности !!! –

+0

Тогда что-то странно, потому что я просто запускал один и тот же тест, с некоторыми фиктивными данными, которые имеют 7718 записей в первой таблице, и 12 записей во втором, а всего - 0.046 секунд. –

+0

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

0

Откуда берутся данные этих двух данных. ?? Если он поступает из базы данных, попробуйте использовать IQueryable или IEnumerable или IList. Они будут быстрее, а также установите параметр LazyLoading как False. Во-первых получить данные в вар или IQueryable или IEnumerable или IList, а затем применить ниже запрос для присоединения:

IQueryable<string> testList = (from p in dbContext.test 
          join c in dbContext.test1 on p.testId equals c.test1Id 
          select c.test1); 

Я надеюсь, что это поможет. :)

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