Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Linq με Unicode

Îåêßíçóå áðü ôï ìÝëïò Tourle. Τελευταία δημοσίευση από το μέλος Tourle στις 11-02-2012, 23:27. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  06-02-2012, 22:06 69169

    Linq με Unicode

    Εχω ενα ερωτημα Linq το οποίο τραβάει δεδομένα απο μια βάση SQL

    Με τις Αγγλικές εγγραφές δεν υπάρχει πρόβλημα με τις Ελληνικές εγγραφές όμως δεν εμφανίζει καμία

    Ξέρω οτι για να εμφανίσει Ελληνικά σε ένα ερώτημα προσθέτουμε το Ν π.χ "select from x where mName=N'xxx'"

    Σε Linq πως μπορεί να γίνει το ερώτημα

    var allcustomers = (from x in entities.Table

       where x.Name.StartsWith(mName)
                                    select x)

     

    Ευχαριστώ

  •  06-02-2012, 22:54 69172 σε απάντηση της 69169

    Απ: Linq με Unicode

    Όπως λέμε κάθε φορά που βγαίνει μία ερώτηση για ελληνικά, "O SQL Server δεν χρειάζεται κόλπα για να υποστηρίξει ελληνικά". Αν το πεδίο στον πίνακα σου είναι nvarchar και τα στοιχεία που έχεις αποθηκεύσει είναι επίσης nvarchar και ότι τίποτε "μασημένα" κινέζικα, δεν θα έχεις κανένα πρόβλημα.

    Από εκεί και πέρα, έχεις το θέμα του case sensitivity το οποίο δεν έχει τίποτε να κάνει με τα ελληνικά. Αν για παράδειγμα το collation της βάσης ή του πεδίου είναι CS (Case Sensitive) το mName που δίνεις θα πρέπει να έχει ακριβώς το ίδιο case με τις τιμές στη βάση. Συνήθως τα default settings με τα οποία δημιουργείται μία βάση είναι CI_AS, που σημαίνει Case Incencitive, Accent Sensitive. Το accent sensitive σημαίνει ότι οι τόνοι λαμβάνονται υπόψη και μία τονισμένη λέξη δεν θεωρείται ίδια με μία μή τονισμένη λέξη.

    Δεν προσδιορίζεις ποιό Linq provider χρησιμοποιείς αλλά υποψιάζομαι ότι μάλλον χρησιμοποιείς Entity Framework. Αυτό το post στο StackOverflow αναφέρει ότι ενώ το LINQ to SQL και το NHibernate εκτελούν ένα LIKE όταν δουν το StartsWith, το Entity Framework το αντικαθιστά με ένα CHARINDEX. Μπλιάχ. 

    Μία λύση είναι να πας σε κάτι πιο ώριμο, όπως το NHibernate. Άλλη λύση είναι αντί για LINQ statement  να χρησιμοποιήσεις EQL:
    var allCustomers=entities.Table.Where("it.Name LIKE @searchTerm", new ObjectParameter("searchTerm", mName));
    Άλλη μία λύση είναι να προσθέσεις το δικό σου Like function στο edmx και να το καλέσεις όπως περιγράφεται εδώ.

    Προσωπικά θα προτιμούσα την 1η λύση, με το ζόρι τη δεύτερη. Θεωρώ εντελώς παρανοϊκό να πρέπει να κάνω τέτοιες αλχημείες για να χρησιμοποιήσω ένα τόσο συνηθισμένο τελεστή όπως το LIKE.

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  07-02-2012, 21:26 69192 σε απάντηση της 69172

    Απ: Linq με Unicode

    πράγματι χρησιμοποιώ entity framework και ο τύπος είναι varchar. στα Αγγλικά το like δουλεύει, μόνο στα ελληνικα δεν επιστρέφει δεδομένα.

    send from windows phone

     

  •  08-02-2012, 13:59 69200 σε απάντηση της 69192

    Απ: Linq με Unicode

    Πρόσεξε ότι ανέφερα Νvarchar. Το varchar δεν είναι Unicode, είναι ASCII. Το ADO.NET (συγκεκριμένα ο SQL Server provider) θα αναγκαστεί να κάνει μετατροπή από Unicode σε ASCII για να τρέξει το query σου. Αυτή η μετατροπή μπορεί να αποτύχει αν έχεις κάνει κάποιο λάθος στο system locale του server ή στο collation του server ή της βάσης. Αν π.χ. έχεις στήσει τη βάση σε μηχάνημα με αγγλικό locale, Latin collation, ο καημένος ο SQL Server provider θα προσπαθήσει να κάνει μετατροπή τους ελληνικούς χαρακτήρες του Unicode σε αγγλικό codepage και φυσικά θα βγάλει σκουπίδια.

    Από τη στιγμή μάλιστα που στο πεδίο σου ΔΕΝ χρησιμοποιείς unicode, δεν πρόκειται να πετύχει καμμία σύγκριση με Unicode χαρακτήρες - ή μάλλον, θα πετύχει μόνο αν μπορέσει να γίνει σωστή μετατροπή, πάντα ελπίζοντας το locale και το collation να είναι σωστά. Άλλα bytes είναι το N'Καλημέρα' και άλλα το 'Καλημέρα' σε Windows 1253.

    Το πρόβλημα δεν είναι στον SQL Server ή στο ADO.NET. Είναι ότι χρησιμοποιείς ASCII πεδία στη βάση αντί για Unicode. Σε οποιαδήποτε βάση και να δουλέψεις θα έχεις πάντα το ίδιο πρόβλημα.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  11-02-2012, 23:27 69263 σε απάντηση της 69200

    Απ: Linq με Unicode

    Έκανα την αλλαγή στον τύπο σε nvarchar αλλά τίποτα πάλι. Μάλλον δεν είναι αυτό γιατί δεν βγάζει αποτελέσματα ούτε σε Αγγλικά ονόματα.

    όταν λες var allCustomers=entities.Table.Where("it.Name LIKE @searchTerm", new ObjectParameter("searchTerm", mName)); το LIKE @searchTerm", LIKE @searchTerm", που ψάχνει; εννοώ like στην αρχή ή στο τέλος ή και τα 2;

    Ακόμη αν θες σε αυτό το ερώτημα να βάλεις και δευτερο πεδίο δηλαδή and address like xxxxx πως συντάσεται;

Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems