VB.Net LINQ Получить имена полей, когда нет строк

У меня есть запрос LINQ к нескольким таблицам данных следующим образом:

query = _
            From bidInfo In dataset.BidInfo.AsEnumerable() _
            Join projectInfo In dataset.ProjectInfo.AsEnumerable() _
            On projectInfo.Field(Of String)("Project") Equals bidInfo.Field(Of String)("Project") _
            Where Not bidInfo.IsAwardedNull AndAlso bidInfo.Awarded.Equals("Yes") And Not bidInfo.IsDate_AwardedNull AndAlso DateTime.Compare(bidInfo.Item("Date Awarded"), latestCheck) >= 0 _
            Select New With { _
                .Job_Number = projectInfo.Field(Of Object)("Job Number"), _
                .Project = projectInfo.Field(Of String)("Project"), _
                .Contractor = bidInfo.Field(Of String)("Contractor"), _
                .Date = Convert.ToDateTime(bidInfo.Field(Of Object)("Date Awarded"))}

Я помещаю результаты в таблицу DataView, а затем сортирую и прочее. Все это работает хорошо, за исключением случаев, когда запрос ничего не возвращает (поскольку нет ничего, что соответствовало бы критериям, это нормально). Если он не возвращает ни одной строки, результирующий DataTable не создает столбцы, что неприемлемо.

Есть ли способ динамически получить, какие столбцы ДОЛЖНЫ быть возвращены запросом? У меня есть куча запросов, и было бы ужасно беспорядочно, если бы я создал статическую таблицу данных для каждого из них. Вероятно, есть очень простое решение, которое я просто еще не смог найти.

Спасибо за любую помощь!

ИЗМЕНИТЬ:

Я отметил ответ Neolisk как ответ, потому что он объясняет, почему у меня возникла проблема (и показывает, что я в значительной степени продублировал вопрос). Однако на самом деле проблема не решена. Если я найду достойное решение, я опубликую его здесь, если у кого-то еще будет такая же проблема.


person Hynch    schedule 01.10.2014    source источник
comment
Похоже, вы решили проблему, используя ссылку, которую я предоставил в своем ответе, это правильно? Если это так, пожалуйста, удалите часть EDIT или, по крайней мере, скажите, что она решена сейчас или что-то в этом роде.   -  person Neolisk    schedule 02.10.2014
comment
На самом деле я не решил проблему. Ваш ответ объяснил, почему он не работает, но, похоже, нет способа получить столбцы, если нет строк. На этой ноте, есть ли способ установить вопрос как нерешенный, но с ним покончено? Если нет, я поставлю это как решенное.   -  person Hynch    schedule 02.10.2014
comment
Вы пробовали один из двух ответов по ссылке, которую я предоставил? Оба, казалось бы, решают вашу проблему.   -  person Neolisk    schedule 02.10.2014
comment
Обходной путь, который Энди публикует и отмечает как ответ, просто возвращает пустую таблицу данных. Похоже, что ответ Винса сработает, но я не смог заставить его работать при объединении нескольких таблиц (это основная причина, по которой я использую LINQ).   -  person Hynch    schedule 03.10.2014
comment
Разве пустой DataTable не именно то, что вам нужно?   -  person Neolisk    schedule 03.10.2014
comment
Нет, я хочу DataTable со столбцами. Пустой DataTable имеет 0 столбцов, но мне нужны столбцы, которые LINQ вернул бы, если бы были строки =/   -  person Hynch    schedule 03.10.2014


Ответы (1)


Вы должны иметь возможность использовать CopyToDataTable следующим образом:

Dim dt As DataTable = query.CopyToDataTable

А затем используйте dt для привязки данных. Ссылка:

EDIT: На самом деле, в предыдущих версиях .NET он ломался, жалуясь на нулевой ввод, не уверен в последнем, но есть обходной путь .AsDataView().ToTable():

person Neolisk    schedule 01.10.2014
comment
Эй, спасибо за ответ. Я использую специальный тип CopyToDataTable (на самом деле он называется SpecialCopyToDataTable =P), который я нашел на форуме для работы с анонимными перечислимыми вещами. Он отлично работает, когда LINQ возвращает строки, он копирует запрос в DataTable именно так, как мне бы хотелось. Проблема заключается в том, что когда запрос не возвращает строк, создаваемая им DataTable не имеет столбцов. Я пытаюсь найти способ получить столбцы, которые должны быть сгенерированы. - person Hynch; 01.10.2014
comment
Эй, так что я на самом деле правильно посмотрел ссылку, которую вы указали, и она имеет дело с этим, так что спасибо за это = D - person Hynch; 01.10.2014