Jeg har forsøgt med en: l.MinEnum.ToString() == filter
Men får denne fejl: Method 'System.Object Parse(System.Type, System.String)' has no supported translation to SQL.
Omvendt har jeg også forsøgt at caste mit filter til MinEnum...men det virker heller ikke. Jeg har søgt på nettet, men ikke fundet et hit omkring mit problem overhovedet.
Nogen herinde der kan hjælpe, så jeg kan komme i seng :)
Med kunstig intelligens skaber HP’s nye OmniBook X 14 en unik og skræddersyet brugeroplevelse målrettet dem, der ønsker høj ydeevne og intelligente funktioner
Det er fordi jeg lægger mine db data ind i mit domæne entitet i samme linq udtryk...det kan være jeg skal smide hele mit linq udtryk ind...istedet for et udpluk af det...det gør jeg, når jeg kommer hjem.
Nej, udtrykket virker fint uden enum. Jeg har sågar andre værdier jeg foretager et tjek på uden problemer.
Jeg kan godt se, der er en syntaks fejl. Deraf en fejl i koden. Spørgsmålet går på at finde ud af, hvordan man behandler en where med en enum i et linq udtryk.
Jeg prøver jeres foreslag, når jeg engang er hjemme.
Er ret ny herinde...men kan se du kan bruge dette.
Som du helt rigtigt har nævnt er Enum desværre ikke understøttet i det nuværende LinqToSql. Desværre fikser MS heller ikke dette problem i deres næste opdatering.
Det du meget hurtigt kan gøre er følgende:
- Åbn din *.dbml i en text editor. - Lokalisér dit "enum" felt, som sikkert i dette tilfælde er af typen System.string. Erstat dette med dit enum med det fulde navn dvs. med namespace fx: MitNamespace.MineEnums.MitEnum. - Gem dette og skriv -> Category = l.Category... - I din where (hvor problemet startede) skriver du herefter blot: l.Category.ToString() == myCategory
Ja, det er desværre et hack, da enum ikke er supporteret. Jeg er dog ikke så bekymret over dette, da dbml filen er autogenereret. Hvis du laver en opdatering af det, så ryger dit felt tilbage til en string type. Det er det eneste, du skal være klar over.
Jeg synes det er en meget skidt idé at redigere i en autogenereret fil som eks.vis dbml. Pludselig sidder man efter nogle måneder og har glemt alt om det og så skal man lige opdatere noget og vupti er koden væk og man kan intet huske.
Jeg synes autogenererede filer er noget skrammel i det hele taget, så man er vel lige vidt. Microsoft har kendt til dette problem i et stykke tid. Den indkopierede kode har opbygning, der er struktureret korrekt. Den anden løsning ville være at behandle rå-data først og herefter mappe dem, hvilket ville være en smule mere omstændigt.
Bliver koden tjekket ind i source control med en tilsvarende beskrivende kommentar, ser jeg ikke noget problem, ligesom alt andet alligevel kan være glemt undervejs. Men det er et lille hack, som jeg har skrevet tidligere.
Det må du spørge CodeJoe om. I hans tilfælde bliver Enum sikkert brugt til at holde på en standardiserede logiske tekst enheder, hvilket er helt legalt. Som default falder en Enum ellers tilbage til en int, men der er intet i vejen i at bruge streng værdier i enums. Hans enum giver sikkert meget mening i de øvre abstraktions niveau (typisk i forretningslogik laget).
Hvis det endelig var det ... så kan du jo stadig netop få ukorrekte værdier ind, da du selv siger den falder tilbage til en int, hvis string værdien ikke findes. ( Altså efter hvordan du laver din casting af string to enum )
Jeg ville bare være sikker på at han er klar over, at han som sådan intet vinder ved det, hvis han alligevel laver sin Enum om til string. Hvorfor så caste til din enum ... :-s
string->enum->string == "EnumStrinValue"
Det virker da sådan lidt mærkeligt, hvis jeg ellers har forstået det rigtigt.
wow...der har været gang i den her selv efter spørgsmålet var lukket.
@d3crypto Du har fuldstændig ret. Jeg har 5 faste streng værdier jeg opererer med, derfor er valget faldet på enum. De samme værdier findes i databasen, og de kan på ingen måder have en anden værdi end de 5. Er der en forkert værdi i databasen, er det en anden applikation, der har lagt noget invalid data ind. Udover dette så har jeg faktisk fejlhåndtering rundt om, hvis en mapping skulle fejle. Så ingen problemer her.
@Buzzz tak for din bekymring, men jeg har gode erfaringer med enums, der holder streng værdier frem for integers, som du måske mere er vant til.
Det er streng værdien af enum, der bliver sammenlignet med en værdi i 'where'... l.Category.ToString() == myCategory. Type sikkerheden findes ikke, da enum ikke supporteret i SQL endnu.
Jeg er ikke helt enig i at autogenereret kode er evil, faktisk er det ret smart når koden er triviel. Jeg gider simpelthen ikke sidde og kode noget som andre allerede har påtaget sig ansvaret for virker :) Når det så er sagt, så afhænger det naturligvis meget af hvilken kode vi snakker om, men eks.vis Linq To... her synes jeg bare at tingene skal være så simple som muligt.
Jo.. partial kan også lave i Ling To Sql.
Derudover giver jeg buzzz ret, jeg synes også enum i det tilfælde her virker underligt forgjort og unødvendigt :) Jeg prøver altid at holde koden så simpel som mulig :)
Auto genereret kode er smart ... i mange tilfælge :-) Bare ikke når man går ind og andre det ... og at skal huske at lave sin egne ændringer i det.
T4 templates bliver jo brugt mere og mere ... og ikke helt uden grund.
Som janus_007 er inde på, så bør man kunne stole på det, det er jo i mange tilfælde .NET selv som laver det autogenererede kode ... eller bør man jo betvivle alt kode. :-)
Igen, hvorfor er det så ikke at man blot bruger partielle klasser til at løse den her?
namespace "namespace på entitetsklasserne" { public partial class MyObject { public Category CategoryEnum { get { return (Category)Enum.Parse(typeof(Category), this.Category); } set { this.Category = value.ToString(); } } } }
Umiddelbart virker det da til at være den simpleste løsning uden nogen umiddelbare problemer?
Er vel for at være mere explicit i sin kode. Jeg selv kan også bedre lide at arbejde med enums end const string klasser. Men ja, er så måske også fordi jeg så ofte bruger flags, at enums er det naturlige valg for mig når muligheden byder sig. E.g. så snart jeg har 3 states, så laver jeg en privat enum.
Jeg vil også lige blande mig for jeg har egentlig også svært ved at forstå hvad galt der er i at bruge en enum her. Det er da fuldt ud ligeså typesikkert at parse den fra en streng end fra en int. Ja faktisk er det meget bedre stil at parse den fra streng, da du vil få en exception hvis man prøver at smide en fejlagtig værdi i enum'en, når den kommer tilbage fra databasen.
Derudover er det altså også noget mere læseligt, i selve databasen at have navnet på værdien frem for et tilfældigt tal.
Jeg kan se debatten har fortsat siden sidst. Jeg ser heller ingen problemer ved at bruge tekstuelle værdier som enums, da det netop låser værdier i afgrænsede logiske enheder. Jeg giver janus ret i at det kan være skidt at rette i autogenerede filer og microsoft er blevet bedre til at overholde deres egne navngivnings konventioner i deres autogenererede filer. Jeg er mest tilhænger af at skrive tingene selv, hvorfor jeg også foretrækker at bruge channelfactory fremfor proxy klasser. Det lille hack er et opråb for mig til microsoft, så de kan tage sig sammen til at åbne op for håndtering af enums mapping med strenge til deres implementation af linq to sql. At tilføje en partial klasse kan også være en farbar vej, men synes det er for omstændigt at øge kompleksiteten af koden på noget så banalt som enums.
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.