.NET 3.5, С#
У меня есть веб-приложение с функцией поиска. Некоторые из полей, которые доступны для поиска, являются столбцами первого класса в таблице, но некоторые из них являются фактически вложенными полями внутри типа данных XML.
Ранее я построил систему для динамического построения SQL для моего поиска. У меня была хорошая иерархия классов, которая построила выражения SQL и условные операторы. Единственная проблема заключалась в том, что это не было безопасно от атак SQL-инъекций.
Я читал превосходную статью Роба Конери (http://blog.wekeroad.com/2008/02/27/creating-in-queries-with-linq-to-sql/), в которой указывалось, что несколько запросов могут объединяться в один TSQL-запрос для сервер, если результат IQueryable никогда не перечислит. Это заставило меня думать, что моя динамическая конструкция поиска слишком сложна - мне просто нужно объединить несколько выражений LINQ.
Например (изобретенный):
Автор: ID (int), LastName (varchar (32)), FirstName (varchar (32))
context.Author.Where(xx => xx.LastName == "Smith").Where(xx => xx.FirstName == "John")
Результаты в следующем запросе:
SELECT [t0].[ID], [t0].[LastName], [t0].[FirstName]
FROM [dbo].[Author] AS [t0]
WHERE ([t0].[LastName] = Smith) AND ([t0].[FirstName] = John)
Я понял, что это может быть идеальным решением для простого создания динамических запросов, которое безопасно от SQL-инъекции - я бы просто перевернул свой результат IQueryable и выполнил выражения условных выражений, чтобы получить мое окончательное выражение с одним исполнением.
Однако я не могу найти поддержки для оценки XML-данных. В TSQL, чтобы получить значение из XML node, мы сделали бы что-то вроде
XMLField.value('(*:Root/*:CreatedAt)[1]', 'datetime') = getdate()
Но я не могу найти эквивалент LINQ to SQL для создания этой оценки. Есть ли один? Я знаю, что могу оценить все стороны, не связанные с XML-условиями, и затем выполнить код кода оценки XML, но мои данные достаточно велики, что A), что много сетевого трафика перетащит на производительность, а B) из-за исключения памяти, если я не могу оценить первую часть XML-БД для исключения определенных наборов результатов.
Идеи? Предложения?
Бонусный вопрос. Если оценка XML на самом деле является возможной стороной БД, как насчет поддержки FLWOR?