Avatar billede pnr Nybegynder
08. oktober 2010 - 09:26 Der er 13 kommentarer og
1 løsning

Linq query der søger i xml parameter i et xml ms sql datafelt

Hvordan kan jeg lave en Linq query der søger i et MS SQL xml datafelt?

f.eks.

mit xml datafelt hedder "ekstrafelt" og den parameter i "xml strengen" jeg ønsker at bruge i min filtrering hedder "antal"

from p in context.PeopleSets where p.ekstradata.antal == "1" select  p;

På forhånd mange tak for svar!
Avatar billede arne_v Ekspert
09. oktober 2010 - 02:32 #1
Prøv med:

from p in context.PeopleSets where XElement.Parse(p.ekstradata).Element("antal") == "1"

Hvis det ikke virker med LINQ så skift til metode kald og lambda udtryk.
Avatar billede pnr Nybegynder
11. oktober 2010 - 08:26 #2
Hej Arne og mange tak for din kommentar!

det virker desværre ikke, jeg får følgende fejl:
LINQ to Entities does not recognize the method 'System.Xml.Linq.XElement Element(System.Xml.Linq.XName)' method, and this method cannot be translated into a store expression.

Jeg må indrømme at jeg ikke er så skarp til lambda, kan du give et eksempel på hvordan den løsning kunne tage sig ud?

På forhånd mange tak!
Avatar billede arne_v Ekspert
11. oktober 2010 - 15:28 #3
Jeg prøver lige at bixe et eksempel.
Avatar billede arne_v Ekspert
12. oktober 2010 - 04:34 #4
Jeg får ikke bixet et eksempel.

Men prøv:

(from p in context.PeopleSets).ToList().Where(p => XElement.Parse(p.ekstradata).Element("antal") == "1")
Avatar billede arne_v Ekspert
12. oktober 2010 - 04:45 #5
Nå jeg fik alligevel testet lidt.

I mit test eksempel fejler:

var qq = from xmlfun in ctx.xmlfun where XElement.Parse(xmlfun.xml).Element("antal").Value=="2" select xmlfun;

Men dette virker:

var tmp = from xmlfun in ctx.xmlfun select xmlfun;
var qq = tmp.ToList().Where(xmlfun => XElement.Parse(xmlfun.xml).Element("antal").Value=="2");
Avatar billede arne_v Ekspert
12. oktober 2010 - 04:45 #6
Jeg er tilbøjelig til at mene at der er noget galt med divers edesign valg, når man ender op sådan her!
Avatar billede pnr Nybegynder
12. oktober 2010 - 13:11 #7
Ja det virkede fint :-) Tusind tak for hjælpen!

Men hvad er det du mener at der er galt med designet?
Det er bare en lille test app, men idéen er at der er nogle produkter med nogle dynmaiske specifikationer, de dynamiske spec. er gemt i XML felter, og det jeg gerne ville, var at søge på en af dynamisk spec.

smid i øvrigt et svar,
Avatar billede arne_v Ekspert
12. oktober 2010 - 14:49 #8
ToList kaldet henter alle raekker op i memory og saa selekterer man der.

det synes jeg ikke er godt design.
Avatar billede arne_v Ekspert
12. oktober 2010 - 14:50 #9
svar
Avatar billede pnr Nybegynder
12. oktober 2010 - 14:52 #10
Nej det kan du have ret i! men så må der da findes en pænere løsning.
Avatar billede Syska Mester
12. oktober 2010 - 14:57 #11
I dit oprindelige spørgsmål går snakken også omkring det:
http://www.eksperten.dk/spm/920674

Den nemme løsning var et XML dokument, men det gør det træls at søge i.

Du skal nok over i noget relationel for at du kan søge på en nemmere/pænere måde.

mvh
Avatar billede pnr Nybegynder
12. oktober 2010 - 15:08 #12
Jo men jeg mener, der må da være en grund til at man har valgt at lave et søgbart XML datafelt i MS SQL, ellers kunne man vel ligeså godt bare bruge et alm. textfelt. Men det kan være at det er Linq der er probelemet?

Min løsning på problemet bliver heller ikke "xml løsningen", men nu vil jeg bare gerne blive lidt klogere på det punkt :-)
Avatar billede keysersoze Guru
12. oktober 2010 - 17:44 #13
Uden at have forsøgt da jeg ikke lige har noget med XML-data ved hånden så bør det vel her, ligesom i alle andre situationer, kunne lade sig gøre at lave tolist() som det sidste;

var qq = tmp.Where(xmlfun => XElement.Parse(xmlfun.xml).Element("antal").Value=="2").ToList();
Avatar billede arne_v Ekspert
13. oktober 2010 - 01:52 #14
Nope.

Problemet er at så længe det er LINQ to SQL/EF, så bliver where oversat til noget SQL og så duer almindelig C# syntax ikke.

Derfor skal man kalde ToList først for at hive listen op i memory og der kunne bruge LINQ to Objects der er lidt mere samarbejdsvillig med C# syntax.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester