Linq vb.net: Найти элемент в DataRow [] - PullRequest
2 голосов
/ 28 сентября 2011
gefundeneID = drTerminal.AsEnumerable().Single(Function(s) s("TerminalID") = RandomID)

Имеет массив DataRow и хочет посмотреть, находится ли RandomID в одной из строк.

Что не так с этим кодом?

EDIT: Получил эту ошибку: оператор = не определен для DBNull и Integer

Ответы [ 3 ]

1 голос
/ 28 сентября 2011

Если вы хотите проверить, есть ли идентификатор в вашем наборе, не используйте Single, поскольку это вызовет исключение, если совпадение не найдено. Если вы хотите вернуть true или false, если совпадение найдено, используйте .Any. Если вы хотите вернуть найденный результат, рассмотрите SingleOrDefault (если вы знаете, что может быть только 0-1 совпадение) или FirstOrDefault, если вы потенциально можете вернуть несколько совпадений.

@ Комментарии Хайнци относительно обнуляемости полей и Option Strict также заслуживают рассмотрения.

1 голос
/ 28 сентября 2011

Видимо, в вашем коде возникли проблемы при сравнении TerminalID, который может быть DBNull, с целым числом RandomID.Вы можете избежать этой проблемы, обратившись к TerminalID следующим образом:

...(Function(s) s.Field(Of Integer?)("TerminalID") = RandomID)

DataRow.Field обеспечивает строго типизированный доступ к полям данных и, при использовании с обнуляемыми типами (такими как Integer?), автоматически преобразует DBNulls в Nothing.Поскольку Integer? (ваше поле) и Integer (RandomID) можно сравнить с =, приведенный выше код должен работать нормально.

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

0 голосов
/ 27 марта 2014

попробуйте следующую функцию:

Private Function ItemAdded(UserID As String) As Boolean
        Return (tbl.Select(String.Format("UserID ='{0}'", UserID)).Count > 0)
End Function
...