2017-01-17 2 views
2

У меня есть запрос LINQ, где мне нужно объединить 3 таблицы, но, похоже, он висит при оценке выражения.LINQ multiple join hang

Вы видите какие-либо проблемы с этим или любыми идеями, почему я буду висит? VS2010 Окно вывода показывает различные темы, выходящие с 0.

Вот выражение LINQ:

var results = (from drECO in dtECO.AsEnumerable() 
        join drBOMTo8 in dtBOM.AsEnumerable() on drECO.Field<string>("PN8Dig") equals drBOMTo8.Field<string>("PN8Dig") 

        from drBOMFrom8 in dtBOM.AsEnumerable() 
        join drFAA8 in dtFAA.AsEnumerable() on drBOMFrom8.Field<string>("PN8Dig") equals drFAA8.Field <string>("PN8Dig") 

        from drBOMFromMon in dtBOM .AsEnumerable() 
        join drFAAMon in dtFAA .AsEnumerable() on drBOMFromMon.Field <string>("Mon") equals drFAAMon.Field <string>("Mon") 


         select new 
        { 
         PN = drECO .Field <string>("PN"), 
         PNNEWREV = drECO.Field <string>("PNNewRev"), 
         PN8DIG = drECO.Field <string >("PN8Dig"), 
         ECO = drECO .Field <string >("ECO"), 
         MON = drFAAMon.Field <string>("Mon"), 
         SUPNUM = drFAAMon.Field <string>("SupNum"), 
         URL = drFAAMon.Field <string>("URL") 
        }).Distinct(); 
+2

' from drBOMmon в dtBOM.AsEnumerable() 'будет создавать декартово произведение. Это предназначено? –

+0

OMG. Огромное спасибо. Я не знал этого. (как сторона, я новичок, и это мой первый вопрос) У меня есть dtECO, что я хочу связать с dtBOM с помощью PN8Dig, а затем я хочу, чтобы dtBOM связывался с dtURL с Mon. Эта логика создает декартовое соединение? Я бы хотел, чтобы все они были внутренними. Спасибо, Иван. –

+0

Да, он создает декартовский продукт, потому что он не связан с предыдущими объединениями. Чтобы сделать это внутреннее соединение, вы должны связать его с «drECO» или «drBOM8Dig», например. вместо 'from drBOMmon in ..' вы должны использовать' join drBOMmon in ... on ... ' –

ответ

0

По моему опыту, повешение и странные вопросы управления потоком с помощью LINQ происходит, когда поставщик, это драйвер или основной базы данных у провайдера есть проблемы.

Если вы используете базу данных, которая может анализировать выполненные запросы, используйте этот механизм, чтобы узнать, что происходит на этом уровне. Если он даже не попал туда, добавьте эту информацию в свой вопрос.

+0

Я использую datatable объекты, а не базу данных. –

0

Ответ в разделе комментариев из первоначального вопроса от @Ivan о том, что «зависание» состояло в том, что оно пыталось выполнить декартово соединение. Исправлено LINQ. потому что он не связан с предыдущими объединениями. Чтобы сделать это внутреннее соединение, вы должны связать его с drECO или drBOM8Dig, например, вместо drBOMmon in .. вы бы использовали join drBOMmon в ... on ... "

+0

Ваш комментарий должен быть указан в вашем ответе, поскольку этот пользователь может удалить комментарий, сделав ваш ответ бесполезным. – Adam