Я постоянно сталкиваюсь с этим при написании запросов с помощью LINQ-to-XML: свойство Value элемента XElement является строкой, но на самом деле данные могут быть целым числом, логическим значением и т. д.
Допустим, у меня есть предложение «где» в моем запросе, которое проверяет, соответствует ли идентификатор, хранящийся в XElement, локальной (целочисленной) переменной с именем «id». Есть два способа сделать это.
<сильный>1. Преобразовать "id" в строку
string idString = id.ToString();
IEnumerable<XElement> elements =
from
b in TableDictionary["bicycles"].Elements()
where
b.Element(_ns + "id").Value == idString
select
b;
<сильный>2. Преобразовать значение элемента в int
IEnumerable<XElement> elements =
from
b in TableDictionary["bicycles"].Elements()
where
int.Parse(b.Element(_ns + "id").Value) == id
select
b;
Мне нравится вариант 2, потому что он сравнивает правильный тип. Технически я мог бы увидеть сценарий, в котором преобразование десятичного или двойного числа в строку заставило бы меня сравнить «1.0» с «1» (что было бы неравным) с десятичным (1.0) с десятичным (1) (что было бы равно) . Хотя предложение where с участием десятичных знаков, вероятно, встречается довольно редко, я мог видеть OrderBy в десятичном столбце - в этом случае это было бы очень серьезной проблемой.
Однако потенциальным недостатком этой стратегии является то, что синтаксический анализ множества строк в запросе может привести к снижению производительности (хотя я понятия не имею, будет ли это значительным для типичного запроса). Может быть более эффективным анализировать только значения элементов, когда существует риск того, что сравнение строк приведет к другому результату, чем сравнение правильного типа значения.
Итак, вы анализируете значения элементов неукоснительно или только при необходимости? Почему?
Спасибо!
ИЗМЕНИТЬ:
Я обнаружил гораздо менее громоздкий синтаксис для преобразования.
<сильный>3. Приведение элемента к типу int
IEnumerable<XElement> elements =
from
b in TableDictionary["bicycles"].Elements()
where
(int)b.Element(_ns + "id") == id
select
b;
Я думаю, что теперь это будет мой предпочтительный метод ... если кто-то не отговорит меня от него :)
РЕДАКТИРОВАНИЕ II:
После публикации моего вопроса мне пришло в голову, что: ЭТО XML. Если бы у меня действительно было достаточно данных, чтобы производительность была проблемой, я бы, вероятно, использовал настоящую базу данных. Итак, еще одна причина пойти на кастинг.