Je possède ce scénario:LINQ to Entities et Xml Les champs
- Une table SQL Server myTable avec field1, XMLField (nvarchar (50) et le serveur sql type de données XML)
- LINQ aux entités
maintenant, je voudrais obtenir une requête comme ceci:
SELECT Field1, XmlField
FROM MyTable
WHERE CAST(XmlField AS nvarchar(4000)) = '<myXml />'
Évidemment, cela est une requête correcte dans SQL Server, mais je ne trouve pas de solution pour écrire ceci dans L2E.
S'il vous plaît aviser que ce code ne fonctionne pas:
var query = from row in context.MyTables
where (string)row.XmlField == "<myXml />"
select row
et d'autres méthodes de la distribution aussi. C'est juste parce que dans L2E le "ToString" ne fonctionne pas correctement.
Maintenant, mon idée est celle-ci: une méthode d'extension:
var query = from row in context.MyTables
select row
query = query.CompareXml("XmlField", "<myXml />")
et c'est la méthode étendue:
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));
}
et encore cela ne fonctionne pas trop.
Maintenant, je voudrais comprendre comment je peux forcer un "Convert" en utilisant Cast afin que je puisse comparer Xml et nvarchar.
Merci à l'avance Massimiliano