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

Имам LINQ заявка за няколко DataTables, както следва:

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 не генерира колони, което е неприемливо.

Има ли някакъв начин динамично да получите какви колони ТРЯБВА да бъдат върнати от заявката? Имам куп заявки и би било ужасно объркващо, ако създам статична 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
Заобиколното решение, което Andy публикува и маркира като отговор, просто връща празна DataTable. Изглежда, че отговорът на Винс ще работи, но не можах да го накарам да работи при свързване на множество таблици (което е основната причина да използвам 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 за обвързване на данни. Справка:

РЕДАКТИРАНЕ: Всъщност се повреждаше в предишни версии на .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