2010-06-07 9 views
10

मैंने इस पर थोड़ा सा शोध किया है और यहां स्टैक ओवरव्लो के साथ-साथ कुछ ब्लॉग पोस्ट पर कुछ लेख देखे हैं, लेकिन उन्हें सटीक उत्तर नहीं मिला है। मैंने यह भी पढ़ा कि 4.0 ढांचे का उपयोग करके इसे करना संभव है, लेकिन अभी तक कोई सहायक साक्ष्य नहीं मिला है।LINQ से SQL SOUNDEX - संभव है?

तो मेरा सवाल है, क्या LINQ से SQL क्वेरी के माध्यम से SOUNDEX निष्पादित करना संभव है?

उत्तर

20

आप फर्जी यूडीएफ का उपयोग करके डेटाबेस में ऐसा कर सकते हैं; एक आंशिक वर्ग में, डेटा संदर्भ के लिए एक विधि जोड़ें:

x => db.SoundsLike(x.QuoteValue) == db.SoundsLike("text") 

प्रारंभिक विचार से: Random row from Linq to Sql

+2

उन लोगों के लिए जिन्होंने नए संस्करणों के साथ प्रयास किया: (और मेरे अपने भविष्य के संदर्भ के लिए) [डीबीफंक्शन ("एसक्यूएलएसवर", "सोंडेक्स")] –

2

यह ठीक है जो ट्रॉय मैग्नीस द्वारा "LINQ to Objects Using C# 4.0" में प्रदर्शित किया गया है।

संपादित करें: उदाहरण टिड-बिट्स और स्पष्टीकरण जोड़ना: लेखक का उदाहरण LINQ से SQL के बजाय ऑब्जेक्ट्स के लिए है। लेखक बस एसक्यूएल सर्वर पर एक IEqualityComparer, जिनमें से कुछ टुकड़े इस तरह देखा ...

public class SoundexEqualityComparer : IEqualityComparer<string> 
{ 
    public bool Equals(string x, string y) 
    { 
    return GetHashCode(x) == GetHashCode(y); 
    } 

    public int GetHashCode(string obj) 
    { 
    //e.g. convert soundex code A123, 
    //to an integer: 65123 
    int result = 0; 

    string s = soundex(obj); 
    if (string.IsNullOrEmpty(s) == false) 
     result = Convert.ToInt32(s[0]) * 1000 + 
       Convert.ToInt32(s.Substring(1, 3)); 
    return result; 
    } 

    private string soundex(string s) 
    { 
    //e.g. book's implementation omitted for this post. 
    } 
} 

//example usage (assuming an array of strings in "names") 
var q = names.GroupBy(s => s, new SoundexEqualityComparer()); 
+4

और जिनके पास पुस्तक नहीं है, क्या आपके पास एक उदाहरण है? –

+2

हालांकि मैस्टागॉग प्रतिक्रिया के लिए मैं आपको धन्यवाद देता हूं, उदाहरण के लिए एक उदाहरण या एक लिंक का लिंक एक पुस्तक के लिंक से अधिक फायदेमंद होगा जो मैं खरीद सकता हूं। –

0

बनाया है, यदि आप एक यूडीएफ (उपयोगकर्ता निर्धारित समारोह) में Soundex लपेट कर सकते हैं। आप इसे अपने डेटाकॉन्टेक्स्ट क्लास में जोड़ सकते हैं, और फिर आप इसे डेटाकॉन्टेक्स्ट के माध्यम से उपयोग करने में सक्षम होना चाहिए।

+0

क्या आप इसका एक उदाहरण प्रदान कर पाएंगे? –

5

के रूप में नीचे

CREATE FUNCTION [dbo].[udfSoundex] 
(
    @Soundex nvarchar(100) 
) 
RETURNS nvarchar(100) 
AS 
BEGIN 
    RETURN Soundex(@Soundex) 
END 

सीधे शब्दों में यह सर्वर एक्सप्लोरर आप डेटा संदर्भ पर दृश्य स्टूडियो dbml फ़ाइल में खींच कर अपने DataContext वर्ग पर सामने आ रहा एक विधि के रूप कोड में इसका इस्तेमाल एक यूडीएफ जोड़े ..

4

के बाद से .net 4 इस

[DbFunction(Name = "SoundEx", IsComposable = true)] 
public string SoundsLike(string input) 
{ 
    throw new NotImplementedException(); 
} 

आप की तरह अभिव्यक्ति के रूप में उपयोग कर सकते हैं साथ ही साथ काम करेगा:

from p in mytable 
where SqlFunctions.SoundCode(p.MyRow) == SqlFunctions.SoundCode("test") 
select p 

अधिक जानकारी यहां: http://msdn.microsoft.com/en-us/library/system.data.objects.sqlclient.sqlfunctions.soundcode.aspx

+1

यह एंटिटी फ्रेमवर्क का संदर्भ है और एसक्यूएल से लिंक नहीं है जो बताता है कि क्यों नहीं हैं ऊपर से वोट। – jpierson

+0

@jpierson सच, मेरा बुरा। लेकिन मुझे यह सवाल एक ईएफ समाधान की तलाश में मिला, तो शायद यह किसी की मदद करेगा। – Marthijn

0

तुम भी SqlFucntions.Difference विधि है, जो Soundex समारोह के लिए नक्शे का उपयोग कर सकते हैं:

SqlFunctions.Difference (स्ट्रिंग, स्ट्रिंग) रिटर्न int - उच्च वापसी मान, अधिक "समान" तार कर रहे हैं।

+0

यह ईएफ है, लिंक से एसक्यूएल नहीं। –