2015-04-17 6 views
0

У меня есть функция VB.NET, чтобы получить список жалоб, основанных на параметре состояния. Он использует метод LINQ и работает нормально:VB.NET - Измените запрос LINQ на запрос DataSet

Public Function getComplain(ByVal stat As Integer) As List(Of ComplainTable) 
    Dim listt = (From tbl In context.ComplainTable _ 
       Where tbl.STATUS = stat _ 
       Select tbl).ToList 
    Return listt 
End Function 

Вопрос, я хочу изменить запрос LINQ к DataSet запроса вместо. Код, который я пробовал, приведен ниже, но я получаю пустой результат/вывод:

Public Function getComplain(ByVal stat As Integer) As List(Of ComplainTable) 
    Dim ut As New Util 

    Dim query = "SELECT * FROM ComplainTable" 
    Dim ds As DataSet = ut.getData(query) 
    Dim dt As DataTable = ds.Tables("SystemComplain") '??? 
    Dim dr As IEnumerable(Of SystemComplain) = dt.AsEnumerable.Select("STATUS = " & stat) '??? 

    Return dr.ToList 
End Function 

Линии, обозначенные ??? это те части, которые я не уверен, что делаю правильно. Я очень новичок в .NET и вам нужно много искать в Интернете, чтобы получить основные вещи.

UPDATE 1

Public Function getComplain(ByVal stat As Integer) As List(Of ComplainTable) 
    Dim ut As New Util 

    Dim query = "SELECT * FROM ComplainTable" 
    Dim ds As DataSet = ut.getData(query) 
    Dim dt As DataTable = ds.Tables(0) 
    Dim dr As IEnumerable(Of ComplainTable) = _ 
        dt.AsEnumerable. _ 
         Where(Function(x) x.Field(Of String)("STATUS") = stat). _ 
         Select(Function(x) New ComplainTable With { _ 
          .STATUS = x.Field(Of String)("STATUS") _ 
         } _ 
         ) 

    Return dr.ToList 
End Function 

ответ

0

Вы не можете ссылаться на объект DataTable сначала по имени, так как вы не предоставил. Однако вы можете использовать индекс.

Dim dt As DataTable = ds.Tables(0) 

Что касается фильтрации, то вместо использования .Выберите, попробуйте. На второй строке, о которой идет речь.

0

Первая строка кода с вопросительными знаками выглядит хорошо для меня, но если это не сработает, попробуйте использовать индекс, как было предложено в другом ответе. Во всяком случае, для следующей строки, используйте метод Enumerable.Where() с правильным выражением предиката:

Dim dr As IEnumerable(Of DataRow) = dt.AsEnumerable. 
             Where(Function(x) x.Field(Of string)("STATUS") = stat) 

Для справки: Queries in LINQ to DataSet

UPDATE:

Dim dr As IEnumerable(Of ComplainTable) = _ 
       dt.AsEnumerable. 
        Where(Function(x) x.Field(Of string)("STATUS") = stat). 
        Select(Function(x) New ComplainTable With { 
               .STATUS = x.Field(Of string)("STATUS") 
               'TODO: manually populate other properties here' 
              } 
         ) 
        } 
+0

Я редактировал использовать индекс для ds.Tables (0) и следуйте за строкой IEnumerable. Но когда я использую IEnumerable (Of DataRow), я получил ошибку, которую DataRow не может быть преобразован в ComplainTable, что является возвращаемым типом функции. – navilink

+0

@navilink Вам нужно вручную создать экземпляр 'ComplainTable' из' DataRow'. Первоначально он создается LINQ-to-SQL, теперь, когда вы переключаетесь на LINQ-to-DataSet, вам нужно обрабатывать его вручную. Проверьте ** ОБНОВЛЕНИЕ ** раздел – har07

+0

Хорошо, я добавил ваш код UPDATE (удалил последнюю скобку из-за синтаксической ошибки), мой последний код находится в UPDATE 1 (в моем исходном сообщении). Тем не менее ничего не возвращается. Я уверен, что в наборе Dataset есть элементы, потому что мне удалось распечатать содержимое. – navilink

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