if..if else..else..in linq к объектам - PullRequest
0 голосов
/ 07 декабря 2011

Учитывая DataView, который содержит несколько строк, я хочу извлечь строку на основе следующих критериев:

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

Моя быстрая попытка просто возвращает первую строку, которая соответствует каким-либо критериям (извините, если синтаксис VB не верен, я не настолько знаком с ним);

  Dim result = (From row In dv.Table.Rows() _
                Where (GetString(row, "id").StartsWith(Me.ID.Substring(0, 3), StringComparison.OrdinalIgnoreCase) AndAlso _
                GetString(row, "id").EndsWith(Me.ID.Substring(Me.RegisteredID.Length - 2, 2), StringComparison.OrdinalIgnoreCase)) OrElse _
                GetString(row, "id").StartsWith(Me.ID.Substring(0, 3), StringComparison.OrdinalIgnoreCase) _
                Select row).FirstOrDefault()

Редактировать: Я хотел добавить, что что-то вроде https://stackoverflow.com/a/443055/685760 выглядит многообещающе, но я не думаю, что это сработает в моей ситуации. Не стесняйтесь поправлять меня, если я ошибаюсь.

1 Ответ

1 голос
/ 07 декабря 2011

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

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

В любом случае ваш код будет в сто раз более читабельным для простых смертных, даже если бы был способ выразить ваши потребности в запросе. Существует такая вещь, как чрезмерное использование Linq;)

...