У меня есть такой сценарий:
- Таблица SQL Server myTable с полем field1, xmlField (тип данных сервера nvarchar (50) и xml sql)
- 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.
Заранее спасибо
Массимилиано