2009-11-16 5 views
3

Je dois sélectionner des lignes de la table de base de données en utilisant le filtrage par colonne de type xml.Filtrage des enregistrements de base de données par contenu de colonne xml en utilisant linq-to-sql et xlinq

Table

ressemble (version courte)

id 
dbfield int 
xmlfield xml 

et je suis le filtrage de cette manière

IQueryable<Data.entity> q = from u in datacontex.entities 
select u; 

if (val1.HasValue) 
    q = q.Where(x => x.dbfield > val1.value) 

if (val2.HasValue) 
    q = q.Where(x=> x.dbfield < val2.value) 

if (!string.IsNullOrEmpty(searchString)) 
q = q.Where (x=> x.xmlfield contains values from searchString) 

XML dans XMLField est très simple, il ressemble

<doc> 
    <item id="no">test/WZ/2009/04/02</item> 
    <item id="title">blabla</item> 
... 

La question est de savoir comment ajouter WHERE condition dans linq et de préférence cette contition devrait traduire à ms-sql requête, w sans traiter le jeu de données sur l'application webservice.

Merci.

Répondre

3

LINQ-to-SQL ne reconnaît pas les extensions xml dans TSQL. Deux choix que je vois:

  • écrire un SPROC/udf pour toute votre requête qui utilise la syntaxe SQL/XML et carte qui à vos données contexte
  • écrire une UDF qui fait le test pour un seul ligne (retour d'un bool), la carte que les données du contexte, et l'utilisation ctx.SomeUdf(row) dans la clause where du LINQ
1

Vous pouvez également créer des colonnes calculées sur votre table SQL Server qui extraient les morceaux de la XML et stockez-les comme s'ils étaient des champs "normaux" sur la table. J'utilise cette technique dans divers endroits tout le temps dans les systèmes de production - fonctionne très bien. Après cela, vous pouvez utiliser ceux comme les champs de table normaux et vous pouvez les utiliser pour filtrer dans Linq-to-SQL - pas de problème.

+0

merci pour l'idée. – tomo

Questions connexes