Linq to Entities и поля XML - PullRequest
       20

Linq to Entities и поля XML

4 голосов
/ 13 октября 2009

У меня есть такой сценарий:

  1. Таблица SQL Server myTable с полем field1, xmlField (тип данных сервера nvarchar (50) и xml sql)
  2. Linq для юридических лиц

Теперь я бы хотел получить такой запрос:

SELECT Field1, XmlField
FROM MyTable
WHERE CAST(XmlField AS nvarchar(4000)) = '<myXml />'

Очевидно, что это правильный запрос в SQL Server, но я не могу найти решение, чтобы написать это в L2E.

Пожалуйста, сообщите, что этот код не работает:

var query = from row in context.MyTables
            where (string)row.XmlField == "<myXml />"
            select row

и другие методы приведения. Это только потому, что в L2E «ToString» не работает правильно.

Теперь моя идея такова: метод расширения:

var query = from row in context.MyTables
            select row

query = query.CompareXml("XmlField", "<myXml />")

и это расширенный метод:

public static IQueryable<TSource> CompareXml<TSource>(this IQueryable<TSource> source, string xmlFieldName, string xmlToCompare)
{
    ConstantExpression xmlValue = Expression.Constant(xmlToCompare);

    ParameterExpression parameter = Expression.Parameter(typeof(TSource), source.ElementType.Name);
    PropertyInfo propertyInfo = typeof(TSource).GetProperty(xmlFieldName);
    MemberExpression memberAccess = Expression.MakeMemberAccess(parameter, propertyInfo);

    var stringMember = Expression.Convert(memberAccess, typeof(string));

    BinaryExpression clauseExpression = Expression.Equal(xmlValue, stringMember);
    return source.Where(Expression.Lambda<Func<TSource, bool>>(clauseExpression, parameter));
}

и опять это тоже не работает.

Теперь я хотел бы понять, как я могу форсировать «Преобразование», используя Cast, чтобы я мог сравнить Xml и nvarchar.

Заранее спасибо Массимилиано

1 Ответ

0 голосов
/ 03 сентября 2012

К сожалению, EF все еще не поддерживает должным образом XML-столбцы. Боюсь, что единственный известный мне выбор - создать представление, которое выполняет приведение типов, и сопоставить его с другим объектом. Это, вероятно, сделает код неудобным, но также предложит дополнительные возможные сценарии; например, с большим количеством кода SQL вы можете отобразить элементы в столбцах XML на фактические столбцы в представлении, что позволяет выполнять запросы к определенным частям XML.

С другой стороны, по крайней мере, вставка значений в столбец XML работает почти так же, как и ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...