লিঙ্কে এসকিউএল% কীভাবে করবেন?


385

এসকিউএল-এ আমার একটি পদ্ধতি রয়েছে যা আমি লিনকে রূপান্তরিত করার চেষ্টা করছি:

SELECT O.Id, O.Name as Organization
FROM Organizations O
JOIN OrganizationsHierarchy OH ON O.Id=OH.OrganizationsId
where OH.Hierarchy like '%/12/%'

আমি যে লাইনটির সাথে সবচেয়ে বেশি উদ্বিগ্ন তা হ'ল:

where OH.Hierarchy like '%/12/%'

আমার একটি কলাম রয়েছে যা বিভাগের 1/3/12 / এর মতো শ্রেণিবিন্যাস সঞ্চয় করে তাই এটি সন্ধান করতে আমি কেবল% / 12 /% ব্যবহার করি।

আমার প্রশ্ন, লিনক বা .NET শতাংশ চিহ্ন ব্যবহার করার সমতুল্য কী?


1
আপনার প্রশ্নের মতো লাইক-অপারেটর ট্যাগের 5জন্য কমপক্ষে ভোট রয়েছে । আমি বিনীত অনুরোধ আপনার প্রস্তাবিত গেল SQL- মতো হিসেবে সমার্থক ?
কেরমিট

উত্তর:


550
.Where(oh => oh.Hierarchy.Contains("/12/"))

আপনি ব্যবহার করতে পারেন .StartsWith()বা .EndsWith()


4
স্টার্টসইথ () বা এন্ডসডথ উইথ () ব্যবহার করা কি কোনও প্রশ্নের উদ্রেক করবে? আমি বলতে চাইছি, কোডটি কোয়েরিতে অনুবাদ করা হবে বা ফলাফলটি ডিবি থেকে পুনরুদ্ধারের পরে অবজেক্টে ফিল্টার করা হবে?
শিক্ষানবিশ

5
না। স্টার্টসইথ () এবং এন্ডসথ উইথ () হ'ল প্রিডিকেট / ফিল্টারটির অংশ। ফাঁসি কার্যকর স্থগিত করা অবিরত।
andleer

2
চেষ্টা করেছে যা নাল রেফারেন্সএক্সেপশন পেয়েছে: অবজেক্ট রেফারেন্স কোনও অবজেক্টের উদাহরণে সেট করা হয়নি। আমার ক্ষেত্রে যখন এ। অ্যাড্রেস 1. স্টারটস উইথ (ঠিকানা 1) এবং এ্যাড্রেস 1 নাল
মাইকেটি

11
StartsWith("abc")রূপান্তরিত হয় LIKE 'abc%'এবং এতে EndsWith("abc")সিভিল করা হয়LIKE '%abc'
সাইমন_উইভার

20
চিঠিগুলি ব্যবহারের ক্ষেত্রে এটি কেন কাজ করছে না তা নিয়ে কাজ করতে পারেনি, তারপরে আমার বোকামিটি অনুধাবন করলেন ... .ToLower().Contains()আপনি যদি মামলাটি উপেক্ষা করতে চান তবে ভুলে যাবেন না । আপনি এই ইচ্ছাটি অবশ্যই চান কিনা তার উপর নির্ভর করে কেস সংবেদনশীল কোলেশন দিয়ে কোনও ডিবি থেকে আপনার মতো নকল করার চেষ্টা করা হচ্ছে কিনা on
অ্যাডাম নাইটস

251

এটা ব্যবহার কর:

from c in dc.Organization
where SqlMethods.Like(c.Hierarchy, "%/12/%")
select *;

22
যদি আপনি লাইক কমান্ড দ্বারা সরবরাহ করা আরও জটিল প্যাটার্ন ম্যাচটি ব্যবহার করতে চান তবে এটি সত্যিই সহায়ক। উদাহরণস্বরূপ, আপনি যদি দুটি সংখ্যার জন্য পরীক্ষা করতে চান (12 এর পরিবর্তে), আপনি এই এক্সপ্রেশনটি ব্যবহার করতে পারেন: SqlMethods.Like (সি। হাইয়ারচি, "% / [0-9] [0-9] /%") এছাড়াও , এই দেখুন msdn.microsoft.com/en-us/library/aa933232(SQL.80).aspx
viggity

এটি আপনি খুব কার্যকর যদি আপনি শক্তি ব্যবহারকারীদের ব্যয়বহুল প্রাথমিক% নিজেকে প্রাক-পেন্ড করার অনুমতি দিতে চান, যেখানে স্টার্টস উইথ বা কন্টেনস ব্যবহার করে শক্তি ব্যবহারকারীকে এই নমনীয়তাটি দেয় না
সাইমন_উইভার

8
SqlMethods"ডট স্বরলিপি" ব্যবহার করে আপনি কীভাবে ব্যবহার করবেন ?
ড্যান-জিএফ

12
মনে রাখবেন যে আপনাকে System.Data.Linq.SqlClientনামের স্থানটি অন্তর্ভুক্ত করতে হবে ।
জোহনা

1
আমি System.Data.Linq.SqlClient সন্ধান করতে পারি নি যদিও আমি System.Data.Linq যুক্ত করতে পারি। এটি অবচয় হয়?
বুড়াক করাকুş

41

আমি ধরে নিচ্ছি আপনি লিনাক-টু-এসকিউএল * ব্যবহার করছেন (নীচের নোটটি দেখুন)। যদি তা হয় তবে স্ট্রিং.সামগ্রী, স্ট্রিং.স্টার্টস উইথ এবং স্ট্রিং ব্যবহার করুন। এসকিউএল তৈরি করতে এসকিউএল লাইক অপারেটর ব্যবহার করে।

from o in dc.Organization
join oh in dc.OrganizationsHierarchy on o.Id equals oh.OrganizationsId
where oh.Hierarchy.Contains(@"/12/")
select new { o.Id, o.Name }

অথবা

from o in dc.Organization
where o.OrganizationsHierarchy.Hierarchy.Contains(@"/12/")
select new { o.Id, o.Name }

দ্রষ্টব্য: * = যদি আপনি .NET 3.5-এ ADO.Net সত্তা ফ্রেমওয়ার্ক (EF / L2E) ব্যবহার করে থাকেন তবে সচেতন হন যে এটি লিনাক-টু-এসকিউএল এর মতো অনুবাদ করবে না। যদিও এল 2 এস যথাযথ অনুবাদ করে তবে, এল 2 ই ভি 1 (3.5) একটি টি-স্কেল এক্সপ্রেশনটিতে অনুবাদ করবে যা আপনার সারণীতে জিজ্ঞাসা করছেন এমন একটি টেবিলের পুরো টেবিল স্ক্যানকে বাধ্য করবে যদি না সেখানে আপনার ক্লাউজ বা ফিল্টারগুলিতে যোগদান না করে অন্য কোনও ভাল বৈষম্যবিদ থাকে।
আপডেট: এটি EF / L2E v4 (.NET 4.0) এ স্থির করা হয়েছে, সুতরাং এটি L2S এর মতো একটি এসকিউএল লাইক উত্পন্ন করবে।


@সাইন দিয়ে আপনার স্ট্রিংগুলি এড়াতে হবে না তবে আমি বুঝতে পারি এটি অনুসরণ করা কেবল একটি ভাল সম্মেলন হতে পারে।
andleer

27

আপনি যদি VB.NET ব্যবহার করে থাকেন তবে উত্তরটি হবে "*"। এখানে আপনার ধারাটি দেখতে কেমন হবে ...

Where OH.Hierarchy Like '*/12/*'

দ্রষ্টব্য: "*" শূন্য বা আরও বেশি অক্ষরের সাথে মেলে। লাইক অপারেটরের জন্য এখানে এমএসডিএন নিবন্ধ দেওয়া আছে


ভিবি লাইক অপারেটরটি কি এল 2 এস কলগুলিতে অনুবাদ করে? (আমার কোনও ধারণা নেই))
অ্যান্ডেলর

8
হ্যাঁ, লিনকুইয়ের ক্যোয়ারী এক্সপ্রেশনে যখন ব্যবহৃত হয় তখন ভিবি লাইক অপারেটর লাইকের এসকিউএল সংস্করণে অনুবাদ হয়। এছাড়াও, ভিবি লাইক অপারেটর কোয়েরি এক্সপ্রেশনগুলিতে সীমাবদ্ধ নয়।
রবার্টজ

1
আমি দেখেছি এটি লিনকিউ অপারেশনের বাইরে রয়েছে। ভাল জিনিস. +1
andleer

9

ওয়েল ইনডেক্সও আমার পক্ষে কাজ করে

var result = from c in SampleList
where c.LongName.IndexOf(SearchQuery) >= 0
select c;

1
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। সূচকগুলি বর্গক্ষেত্রে CHARINDEX এ অনুবাদ করে। এটি সম্ভবত লাইকের চেয়ে দ্রুত হতে পারে be তবে এগুলি বাদ দিয়ে এটি '% কিছু%%%' এর মতো অনুসন্ধান কোয়ালিটি তৈরির সম্ভাবনা দেয়। যেখানে 'কিছু' আগে 'জিনিস' এর আগে অবস্থিত থাকতে হবে, যা কন্টেন্টগুলি দিয়ে করা যায় না।
রুয়ার্ড ভ্যান এলবার্গ

আমার যখন উত্তরগুলি প্রয়োজন হয় 8 বছর বয়সের হয় এবং গৃহীত উত্তরের নীচে বেশ কয়েকটি স্তরকে টেক করা হয় তখন আমি এটি পছন্দ করি। সহজভাবে বললে, এটি কাজ করে। কন্টেন্টগুলি (@ "/ 12 /") এবং অন্যান্য অনুরূপ উত্তর দেয় নি। অনেক প্রশংসিত!
আইডুসঅর্টাস

4

যেমন কোড ব্যবহার করুন

try
{
    using (DatosDataContext dtc = new DatosDataContext())
    {
        var query = from pe in dtc.Personal_Hgo
                    where SqlMethods.Like(pe.nombre, "%" + txtNombre.Text + "%")
                    select new
                    {
                        pe.numero
                        ,
                        pe.nombre
                    };
        dgvDatos.DataSource = query.ToList();
    }
}
catch (Exception ex)
{
    string mensaje = ex.Message;
}

4

.NET কোর এখন আছে EF.Functions.Like


ওপির সমস্যা সমাধানের জন্য এটি কীভাবে ব্যবহার করবেন তা আপনি ব্যাখ্যা করতে পারেন?
রবার্ট কলম্বিয়া

এলপির উত্তরটি দেখুন, এটি স্কেলমেথডসের কেবল মূল সংস্করণ ike লাইক
কোফিফাস

এই উত্তরণটিতে এই ফাংশনটি কীভাবে ব্যবহার করা যায় তার একটি কার্যক্ষম উদাহরণ থাকতে হবে।
ফক্সডেপলয়ে

3

যদি আপনি সংখ্যার স্ট্রিংয়ের সাথে মেলে না, তবে সর্বদা সাধারণ ক্ষেত্রে থাকা ভাল:

.Where(oh => oh.Hierarchy.ToUpper().Contains(mySearchString.ToUpper()))

2

আমি সর্বদা এটি করি:

from h in OH
where h.Hierarchy.Contains("/12/")
select h

আমি জানি আমি পছন্দ মতো বিবৃতিটি ব্যবহার করি না তবে পটভূমিতে এটি ঠিকঠাক কাজ হচ্ছে এটি লাইক স্টেটমেন্ট সহ কোনও প্রশ্নের মধ্যে অনুবাদ করা।


আপনার উত্তর গৃহীত উত্তর (7 বছর আগে উত্তর) বা অন্যান্য উত্তরগুলির চেয়ে আলাদা কীভাবে? এটি কোন মান যুক্ত করে?
ডেভিড ফেরেঞ্জি রোগোয়ান

1
@ দাভিডফেরেনজি এই উত্তরটি "ফু ইন বার" ক্যোয়ারী বাক্য গঠন নিয়ে কাজ করে এবং স্বীকৃত উত্তরটি তা দেয় না।
নাস্তে

1

এটি চেষ্টা করুন, এটি আমার পক্ষে ভাল কাজ করে

from record in context.Organization where record.Hierarchy.Contains(12) select record;


0

রয়েছে Linq ব্যবহার করা হয়, ঠিক মতো SQL এর যে ব্যবহার করা হয়।

string _search="/12/";

। । ।

.Where(s => s.Hierarchy.Contains(_search))

আপনি আপনার এসকিউএল স্ক্রিপ্টটি লিঙ্কে নিম্নলিখিত হিসাবে লিখতে পারেন:

 var result= Organizations.Join(OrganizationsHierarchy.Where(s=>s.Hierarchy.Contains("/12/")),s=>s.Id,s=>s.OrganizationsId,(org,orgH)=>new {org,orgH});

0

লিনকিউ-তে আমার "এসকিউএল লাইক" পদ্ধতিটি দেখার জন্য এখানে যেমন আমার মতো কাঁপছে তাদের জন্য আমি এমন কিছু করেছি যা খুব ভাল কাজ করছে।

আমি এমন একটি ক্ষেত্রে রয়েছি যেখানে কলামের জোট পরিবর্তন করতে কোনওভাবেই আমি ডাটাবেস পরিবর্তন করতে পারি না। সুতরাং এটি করার জন্য আমার লিনকিউতে একটি উপায় খুঁজে বের করতে হবে।

আমি হেল্পার পদ্ধতিতে SqlFunctions.PatIndexডাইনী অ্যাক্টটি সত্যিকারের এসকিউএল লাইক অপারেটরের মতো ব্যবহার করছি।

প্রথমে আমার সন্ধানের মান হিসাবে সম্ভাব্য সমস্ত ডায়াক্রিটিক্স (একটি শব্দ যা আমি শিখেছি) গণনার দরকার যেমন এরকম কিছু পেতে:

déjà     => d[éèêëeÉÈÊËE]j[aàâäAÀÂÄ]
montreal => montr[éèêëeÉÈÊËE][aàâäAÀÂÄ]l
montréal => montr[éèêëeÉÈÊËE][aàâäAÀÂÄ]l

এবং তারপরে লিনকিউতে উদাহরণের জন্য:

var city = "montr[éèêëeÉÈÊËE][aàâäAÀÂÄ]l";
var data = (from loc in _context.Locations
                     where SqlFunctions.PatIndex(city, loc.City) > 0
                     select loc.City).ToList();

সুতরাং আমার প্রয়োজনের জন্য আমি একটি সহায়ক / এক্সটেনশন পদ্ধতি লিখেছি

   public static class SqlServerHelper
    {

        private static readonly List<KeyValuePair<string, string>> Diacritics = new List<KeyValuePair<string, string>>()
        {
            new KeyValuePair<string, string>("A", "aàâäAÀÂÄ"),
            new KeyValuePair<string, string>("E", "éèêëeÉÈÊËE"),
            new KeyValuePair<string, string>("U", "uûüùUÛÜÙ"),
            new KeyValuePair<string, string>("C", "cçCÇ"),
            new KeyValuePair<string, string>("I", "iîïIÎÏ"),
            new KeyValuePair<string, string>("O", "ôöÔÖ"),
            new KeyValuePair<string, string>("Y", "YŸÝýyÿ")
        };

        public static string EnumarateDiacritics(this string stringToDiatritics)
        {
            if (string.IsNullOrEmpty(stringToDiatritics.Trim()))
                return stringToDiatritics;

            var diacriticChecked = string.Empty;

            foreach (var c in stringToDiatritics.ToCharArray())
            {
                var diac = Diacritics.FirstOrDefault(o => o.Value.ToCharArray().Contains(c));
                if (string.IsNullOrEmpty(diac.Key))
                    continue;

                //Prevent from doing same letter/Diacritic more than one time
                if (diacriticChecked.Contains(diac.Key))
                    continue;

                diacriticChecked += diac.Key;

                stringToDiatritics = stringToDiatritics.Replace(c.ToString(), "[" + diac.Value + "]");
            }

            stringToDiatritics = "%" + stringToDiatritics + "%";
            return stringToDiatritics;
        }
    }

আপনার কারও কাছে যদি এই পদ্ধতিটি বাড়ানোর পরামর্শ থাকে তবে আমি আপনার কথাটি শুনে দয়া করে খুশি হব।


আপনার উদাহরণটি মূলত একটি হোমব্রিউড অ্যাকসেন্ট সংবেদনশীল সমষ্টি। আমাকে একবার একটি প্রকল্পের সাথে ডিল করতে হয়েছিল যেখানে প্রতিটি কোয়েরি একটি সঠিক ফিলিপ স্বয়ংক্রিয়ভাবে সম্পন্ন হবে তা অর্জন করতে একটি ফিল্টার দিয়ে গিয়েছিল। সাধারণত আরও ভাল পদ্ধতির জন্য দয়া করে স্ট্যাকওভারফ্লো.com/ a/ 2461550/1736944 দেখুন । ডাটাবেস, টেবিল এবং / অথবা ক্ষেত্রকে উপযুক্ত হিসাবে উপযুক্ত বলে মনে করা উচিত lation (স্থানে সঠিক কোলেশন ব্যতীত কাজ করা নির্ভেজাল নির্যাতন)
9

0

দেরিতে, তবে এসকিউএল লাইনের স্টাইলের ওয়াইল্ডকার্ড ব্যবহার করে স্ট্রিং তুলনা করতে সক্ষম হতে আমি এটি একসাথে ছুঁড়েছি:

public static class StringLikeExtensions
{
    /// <summary>
    /// Tests a string to be Like another string containing SQL Like style wildcards
    /// </summary>
    /// <param name="value">string to be searched</param>
    /// <param name="searchString">the search string containing wildcards</param>
    /// <returns>value.Like(searchString)</returns>
    /// <example>value.Like("a")</example>
    /// <example>value.Like("a%")</example>
    /// <example>value.Like("%b")</example>
    /// <example>value.Like("a%b")</example>
    /// <example>value.Like("a%b%c")</example>
    /// <remarks>base author -- Ruard van Elburg from StackOverflow, modifications by dvn</remarks>
    /// <remarks>converted to a String extension by sja</remarks>
    /// <seealso cref="/programming/1040380/wildcard-search-for-linq"/>
    public static bool Like(this String value, string searchString)
    {
        bool result = false;

        var likeParts = searchString.Split(new char[] { '%' });

        for (int i = 0; i < likeParts.Length; i++)
        {
            if (likeParts[i] == String.Empty)
            {
                continue;   // "a%"
            }

            if (i == 0)
            {
                if (likeParts.Length == 1) // "a"
                {
                    result = value.Equals(likeParts[i], StringComparison.OrdinalIgnoreCase);
                }
                else // "a%" or "a%b"
                {
                    result = value.StartsWith(likeParts[i], StringComparison.OrdinalIgnoreCase);
                }
            }
            else if (i == likeParts.Length - 1) // "a%b" or "%b"
            {
                result &= value.EndsWith(likeParts[i], StringComparison.OrdinalIgnoreCase);
            }
            else // "a%b%c"
            {
                int current = value.IndexOf(likeParts[i], StringComparison.OrdinalIgnoreCase);
                int previous = value.IndexOf(likeParts[i - 1], StringComparison.OrdinalIgnoreCase);
                result &= previous < current;
            }
        }

        return result;
    }

    /// <summary>
    /// Tests a string containing SQL Like style wildcards to be ReverseLike another string 
    /// </summary>
    /// <param name="value">search string containing wildcards</param>
    /// <param name="compareString">string to be compared</param>
    /// <returns>value.ReverseLike(compareString)</returns>
    /// <example>value.ReverseLike("a")</example>
    /// <example>value.ReverseLike("abc")</example>
    /// <example>value.ReverseLike("ab")</example>
    /// <example>value.ReverseLike("axb")</example>
    /// <example>value.ReverseLike("axbyc")</example>
    /// <remarks>reversed logic of Like String extension</remarks>
    public static bool ReverseLike(this String value, string compareString)
    {
        bool result = false;

        var likeParts = value.Split(new char[] {'%'});

        for (int i = 0; i < likeParts.Length; i++)
        {
            if (likeParts[i] == String.Empty)
            {
                continue;   // "a%"
            }

            if (i == 0)
            {
                if (likeParts.Length == 1) // "a"
                {
                    result = compareString.Equals(likeParts[i], StringComparison.OrdinalIgnoreCase);
                }
                else // "a%" or "a%b"
                {
                    result = compareString.StartsWith(likeParts[i], StringComparison.OrdinalIgnoreCase);
                }
            }
            else if (i == likeParts.Length - 1) // "a%b" or "%b"
            {
                result &= compareString.EndsWith(likeParts[i], StringComparison.OrdinalIgnoreCase);
            }
            else // "a%b%c"
            {
                int current = compareString.IndexOf(likeParts[i], StringComparison.OrdinalIgnoreCase);
                int previous = compareString.IndexOf(likeParts[i - 1], StringComparison.OrdinalIgnoreCase);
                result &= previous < current;
            }
        }

        return result;
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.