2008-11-26 17 views
10

का उपयोग कर SQL सर्वर में लहजे को अनदेखा करना LINQ से SQL का उपयोग कर SQL सर्वर डेटाबेस में किए गए प्रश्नों में उच्चारण (जैसे ',', ~) को कैसे अनदेखा कर सकता है?LINQ से SQL

अद्यतन:

फिर भी पता लगा नहीं है कि कैसे LINQ में यह करने के लिए (या यहां तक ​​कि अगर यह संभव है), लेकिन मैं इस समस्या को हल करने के लिए डेटाबेस को बदलने में कामयाब रहे। बस उन क्षेत्रों पर एकत्रण को बदलना पड़ा जिन्हें मैं खोजना चाहता था। मेरे पास जो संयोजन था:

SQL_Latin1_General_CP1_CI_AS 

सीआई "केस असंवेदनशील" और "एक्सेंट संवेदनशील" के लिए एएस के लिए रुकता है। इसे "एक्सेंट असंवेदनशील" बनाने के लिए एएस को एआई में बदलना पड़ा। SQL विवरण इस प्रकार है:

ALTER TABLE table_name ALTER COLUMN column_name column_type COLLATE collation_type 
+0

बस अपनी आंखें बंद करें ... – NotMe

+0

टैग का उद्देश्य केवल कुछ भी नहीं करना है, विषय लिनक है, इसलिए बस 'linq' का उपयोग करें, 'sqltolinq' न बनाएं क्योंकि कोई और कभी ऐसा नहीं करेगा एक यादृच्छिक टैग फिर से, तो यह एक अपशिष्ट है। – TravisO

+0

हम्म, मैंने अभी एक नया टैग नहीं बनाया है, मैंने 'linqtosql' का उपयोग किया है जिसका उपयोग लगभग 2 9 0 प्रश्नों में किया गया है ... – Farinha

उत्तर

2

एसक्यूएल प्रश्नों में (SQL सर्वर 2000 +, के रूप में मुझे याद है), तो आप का चयन MyString की तरह कुछ करने से यह करते हैं, MyID MyTable से जहाँ MyString मुक़ाबला Latin1_General_CI_AI = 'aaaa'।

मुझे यकीन नहीं है कि यह लिंक में संभव है, लेकिन लिंकक के साथ अधिक आरामदायक कोई अनुवाद कर सकता है।

यदि आप सॉर्टिंग के साथ ठीक हैं और चयन/जहां प्रश्नों को हमेशा अनदेखा अनदेखा करते हैं, तो आप तालिका (ओं) पर उसी संयोजन को निर्दिष्ट करने के लिए तालिका को बदल सकते हैं जिसके साथ आप चिंतित हैं।

+0

यहां एक नमूना है, मैंने शायद इसे अपनी वेब खोजों में से एक से उठाया लेकिन यूआरएल याद नहीं कर सकता। चुनें * से nametable कहां नाम = 'abbee' मुक़ाबला Latin1_General_CI_AI - केस-संवेदी, एक्सेंट-संवेदी तुलना और की तरह '% एक्सेंट%' मुक़ाबला Latin1_General_CI_AS - केस-संवेदी, एक्सेंट के प्रति संवेदनशील तुलना आदेश द्वारा <अभी तक एक और कॉलम> डीईएससी कॉललेट लैटिन 1_General_CS_AS - केस-सेंसिटिव, एक्सेंट-सेंसिटिव सॉर्ट ऑर्डर – Raj

1

LINQ से SQL में क्वेरी के लिए उपयोग किए गए संयोजन को सेट करने के लिए कोई विशिष्ट कार्यक्षमता नहीं है और इसलिए यह हमेशा डेटाबेस डिफ़ॉल्ट का उपयोग करेगा।

2

निम्नलिखित जवाब देखें:

LINQ Where Ignore Accentuation and Case

मूल रूप से आप एसक्यूएल सर्वर, उदा फ़ील्ड प्रकार को बदलने की जरूरत

ALTER TABLE People ALTER COLUMN Name [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AI 

इस LINQ का उपयोग कर ऐसा करने के लिए, के अलावा एक कस्टम विधि बुला विशेषक (जो performant नहीं होगा) को हटाने के लिए से एक तरीका हो प्रतीत नहीं होता है।

1

ऐसा लगता है T-SQL कार्यों का उपयोग करके SQL करने के लिए Linq में मिलान मतभेद की अनदेखी करने के लिए एक रास्ता है कि वहाँ:

CREATE FUNCTION [dbo].[func_ConcatWithoutCollation] 
(
    @param1 varchar(2000), 
    @param2 varchar(2000) 
) 
RETURNS varchar(4000) 
AS 
BEGIN 
    IF (@param1 IS NULL) SET @param1 = '' 
    IF (@param2 IS NULL) SET @param2 = '' 
    RETURN @param1 COLLATE Latin1_General_CS_AS + @param2 COLLATE Latin1_General_CS_AS 
END 

एसक्यूएल करने के लिए LINQ में इस समारोह को पाने के लिए, वहाँ SqlMetal के लिए एक स्विच है:/कार्य करता है। उदाहरण: इस तरह SQL के

"%ProgramFiles%\Microsoft SDKs\Windows\v7.0A\Bin\SqlMetal.exe" /server:. /database:NameOfDatabase /pluralize /code:ContextGenerated.cs /sprocs /views /functions 

Linq में इस समारोह का उपयोग करें:

from s in context.Services 
where context.Func_ConcatWithoutCollation(s.Description, s.Email) == "whatever" 
select s 

यह मुझे मदद मिली है, शायद किसी को भी यह उपयोगी पाता है।