2009-10-12 7 views
4

Je possède ce scénario:LINQ to Entities et Xml Les champs

  1. Une table SQL Server myTable avec field1, XMLField (nvarchar (50) et le serveur sql type de données XML)
  2. 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

Répondre

0

Malheureusement EF ne supporte toujours pas correctement les colonnes XML. Je crains que le seul choix que je connaisse soit de créer une vue qui fasse la distribution et qui soit mappée à une entité différente. Cela rendra probablement le code inconfortable mais offre également d'autres scénarios possibles; par exemple, avec beaucoup de code SQL, vous pouvez mapper des éléments dans les colonnes XML aux colonnes réelles de la vue, ce qui vous permet d'effectuer des requêtes sur des parties spécifiques du XML.

Sur le côté positif, au moins insérer des valeurs dans une colonne XML fonctionne à peu près comme prévu.