সত্তা ফ্রেমওয়ার্ক অপারেটর পছন্দ?


93

আমরা স্ট্রিং ফিল্ড সহ আমাদের সত্তাগুলির জন্য সত্তা ফ্রেমওয়ার্কে "লাইক" অপারেটরটি বাস্তবায়নের চেষ্টা করছি, তবে এটি সমর্থিত বলে মনে হচ্ছে না। অন্য কেউ এরকম কিছু করার চেষ্টা করেছে?

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


4
আপনি যদি ইতিমধ্যে EF 6.2.x ব্যবহার করছেন তবে এই উত্তরে যান করতে এই উত্তরটি আপনি ব্যবহার যদি করছি মতিন কোর 2.x
CodeNotFound

উত্তর:


36

এটি এখন একটি পুরাতন পোস্ট, তবে যে কেউ উত্তর খুঁজছেন তাদের জন্য এই লিঙ্কটি সহায়তা করা উচিত। আপনি যদি ইতিমধ্যে EF 6.2.x ব্যবহার করছেন তবে এই উত্তরে যান করতে এই উত্তরটি আপনি মতিন কোর 2.x ব্যবহার করছেন

সংক্ষিপ্ত সংস্করণ:

SqlFunifications.PatIndex পদ্ধতি - একটি নির্দিষ্ট অভিব্যক্তিতে কোনও প্যাটার্নের প্রথম উপস্থিতির সূচনা অবস্থান বা সমস্ত বৈধ পাঠ্য এবং চরিত্রের ডেটা টাইপগুলিতে প্যাটার্নটি পাওয়া না গেলে শূন্যগুলি প্রদান করে

নেমস্পেস: সিস্টেম.ডাটা.অবজেক্টস.এসএইচএল ক্লায়েন্ট অ্যাসেমব্লী: সিস্টেম.ডাটা.এন্টিটি (সিস্টেম.ডাটা.এন্টি.ডিল ইন)

এই ফোরামের থ্রেডে কিছুটা ব্যাখ্যাও উপস্থিত হয় ।


59
নীচের উত্তরের সাথে এই প্রশ্নের পিছনে লিঙ্কযুক্ত কোনও এমএসডিএন ফোরামের সাথে লিঙ্কযুক্ত যেভাবে গৃহীত উত্তর কীভাবে হয় ?
ইওনসদন

উত্তরটি ছিল SQLlunus.PatIndex পদ্ধতিটি ব্যবহার করা। লিঙ্কযুক্ত ফোরামের থ্রেডটি ছিল আরও কিছুটা "ব্যাকগ্রাউন্ড" তথ্য সরবরাহ করা।
ইয়ান দুরান

নীচের উত্তরটি সাধারণ নিদর্শনগুলির জন্য দুর্দান্ত, তবে যদি আমি "WHERE Name LIKE 'abc [0-9]%" "বা আরও কিছু জটিল প্যাটার্ন বলতে চাই, কেবল কন্টেন্টস () ব্যবহার করে এটি একেবারেই কাটেনি।
হটএন

4
এই প্রশ্নের এই পুরানো উত্তর ডুপ । (এর প্রথম অংশের নয়, এর বিকল্প সমাধানের জন্য))
ফ্রেডেরিক

155

আমি সত্যিই EF সম্পর্কে কিছুই জানি না, তবে লিংক থেকে এসকিউএল-এ আপনি সাধারণত স্ট্রিং.কন্টেনস ব্যবহার করে একটি লাইক ক্লজ প্রকাশ করেন:

where entity.Name.Contains("xyz")

অনুবাদ

WHERE Name LIKE '%xyz%'

(ব্যবহার StartsWithএবং EndsWithঅন্যান্য আচরণের জন্য।)

এটি সহায়ক কিনা আমি পুরোপুরি নিশ্চিত নই, কারণ আপনি যখন বলে যে আপনি লাইক প্রয়োগের চেষ্টা করছেন তখন আপনি কী বোঝাতে চেয়েছিলেন তা আমি বুঝতে পারি না । যদি আমি পুরোপুরি ভুল বুঝে থাকি তবে আমাকে জানান এবং আমি এই উত্তরটি মুছব :)


4
অনুগ্রহ করে নোট করুন যে "" নামটির মতো '% xyz%' "কোনও সূচক ব্যবহার করতে অক্ষম হবে, সুতরাং টেবিলটি যদি বিশাল হয় তবে এটি ভাল অভিনয় করতে পারে না ...
মিচ হুইট

4
ঠিক আছে, আমরা চাই বালা * ব্লা ফু বার ফু? বার? ফু বারে ম্যাচ করতে সক্ষম হতে ? এবং অন্যান্য জটিল নিদর্শন। আমাদের বর্তমান পদ্ধতির সাথে আপনি যা উল্লেখ করেছেন তার সমান, আমরা এই প্রশ্নগুলি হ'ল ইনডেক্স, স্টার্টউইথ, এন্ডসইথ ইত্যাদি ব্যবহার করে অপারেশনে রূপান্তর করব I আমি কেবল আশা করছিলাম যে আরও সাধারণ-উদ্দেশ্য সমাধান রয়েছে।
ঘুষ দিন

4
যে সম্পর্কে আমি অবগত নই - আমার সন্দেহ হয় যে জটিল নিদর্শনগুলি আরও বেশি ডিবি-নির্দিষ্ট হয়ে যায় এবং সাধারণভাবে প্রকাশ করা শক্ত।
জন স্কিটি

4
@ জোন স্কিটি: আমার সর্বোত্তম জ্ঞানের মতো লাইক কার্যকারিতাটি এএনএসআই স্ট্যান্ডার্ডে রয়েছে এবং এটি এসকিউএল সার্ভার, ওরাকল এবং ডিবি 2-তেও বেশ একই রকম।
একে

4
এই অপারেটরগুলি এবং এমএস এসকিউএল ব্যবহার করে আমি একটি জিনিস দেখেছি তা হ'ল EF এগুলিকে পালিয়ে যাওয়া প্যারামিটার হিসাবে যুক্ত করেছে "নাম পছন্দ করুন @ p__linq__1 এসকেপ এন '' ~ '" "যা আমার খুব সীমিত ব্যবহারের ক্ষেত্রে অনেক ধীর গতিতে পারফর্ম করে যদি অনুসন্ধানের স্ট্রিং থাকে "% xyz%" এর মতো নামটির ক্যোয়ারীতে রয়েছে the আমার কাছে এখনও আমি স্টার্টসইথ এবং কনটেনস ব্যবহার করি এমন দৃশ্যের জন্য আমি ডায়নামিক লিনাকের মাধ্যমে তা করি কারণ এটি আমার দৃশ্যে একটি এসকিউএল বিবৃতিতে প্যারামিটারকে ইনজেক্ট করে যা আমার দৃশ্যে তৈরি করে আরও দক্ষ ক্যোয়ারী sureএটি EF 4.0 জিনিস কিনা তা নিশ্চিত নন আপনি একই জিনিস অর্জন করতে অবজেক্টকোয়ারি প্যারামিটারগুলিও ব্যবহার করতে পারেন ...
শ্যান

35

আমারও একই সমস্যা ছিল।

আপাতত, আমি ক্লায়েন্ট-সাইড ওয়াইল্ডকার্ড / রেজেক্স ফিল্টারিংয়ের সাথে http://www.codeproject.com/Articles/11556/Converting-Wildcards-to-Regexes?msg=1423024#xx1423024xx এর উপর ভিত্তি করে নিষ্পত্তি করেছি - এটি সহজ এবং কাজ করে প্রত্যাশিত

আমি এই বিষয়টিতে আরেকটি আলোচনা পেয়েছি: http://forums.asp.net/t/1654093.aspx/2/10
এই পোস্টটি আশাপ্রদ দেখাচ্ছে যদি আপনি সত্তা ফ্রেমওয়ার্ক> = 4.0 ব্যবহার করেন:

SQLlFunifications.PatIndex ব্যবহার করুন:

http://msdn.microsoft.com/en-us/library/system.data.objects.sqlclient.sqlfunitions.patindex.aspx

এটার মত:

var q = EFContext.Products.Where(x =>
SqlFunctions.PatIndex("%CD%BLUE%", x.ProductName) > 0);

দ্রষ্টব্য: এই সমাধানটি কেবল এসকিউএল-সার্ভারের জন্য, কারণ এটি অ-মানক PATINDEX ফাংশন ব্যবহার করে।


প্যাট ইন্ডেক্সের "কাজ" করার সময়, এটি আপনাকে কামড়ানোর জন্য ফিরে আসবে, প্যাট ইন্ডেক্স যেখানে কলমটি আপনি যে কলামটিতে ফিল্টার করতে চান সেই কলামে সূচিগুলি ব্যবহার করে না।
ব্ল্যাকইস

@ ব্ল্যাকাইস এটি প্রত্যাশিত আপনি যখন অভ্যন্তরীণ পাঠ্য (% সিডি% ব্লু%) অনুসন্ধান করেন সার্ভার সূচকগুলি ব্যবহার করতে সক্ষম হবে না। যখনই সম্ভব হবে, প্রারম্ভিক পাঠ্যগুলি (সিডি% ব্লু%) থেকে সন্ধান করা আরও দক্ষ।
23:44 এ 7

@ সুরফেন প্যাটিনডেক্স এর চেয়েও খারাপ, যদিও এটি সামনে% ছাড়াই সূচকটি ব্যবহার করবে না, প্যাটিনডেক্সের সাথে (ব্লু সিডি%) অনুসন্ধান করে কলাম সূচী ব্যবহার করবে না।
ব্ল্যাকইস


21

নেই LIKEঅপারেটর সংযোজন করা হয় Entity Framework Core 2.0:

var query = from e in _context.Employees
                    where EF.Functions.Like(e.Title, "%developer%")
                    select e;

এর সাথে তুলনা করা আমরা পদ্ধতির চেয়ে দেখতে ... where e.Title.Contains("developer") ...সত্যই অনূদিত ।SQL LIKECHARINDEXContains


5

সত্ত্বা এসকিউএলের অংশ হিসাবে এটি ডকুমেন্টেশনে বিশেষভাবে উল্লেখ করা হয়েছে। আপনি একটি ত্রুটির বার্তা পাচ্ছেন?

// LIKE and ESCAPE
// If an AdventureWorksEntities.Product contained a Name 
// with the value 'Down_Tube', the following query would find that 
// value.
Select value P.Name FROM AdventureWorksEntities.Product 
    as P where P.Name LIKE 'DownA_%' ESCAPE 'A'

// LIKE
Select value P.Name FROM AdventureWorksEntities.Product 
    as P where P.Name like 'BB%'

http://msdn.microsoft.com/en-us/library/bb399359.aspx


4
ভবিষ্যতে আপনি যদি ইএফ থেকে দূরে সরে যেতে চান তবে আমি সত্তা এসকিউএল থেকে দূরে থাকতে প্ররোচিত হব। এটি নিরাপদে খেলুন এবং পরিবর্তে মূল প্রতিক্রিয়ার মধ্যে থাকা (), স্টার্টস উইথ () এবং এন্ডস উইথ () বিকল্পগুলির সাথে লেগে যান।
স্টিফেন নিউম্যান

4
এটি সূক্ষ্ম সংকলন করে তবে রানটাইম ব্যর্থ হয়।
ঘুষ দিন

আমি পোস্ট করা কোডটি রানটাইমে ব্যর্থ হয়? এটি মাইক্রোসফ্ট লিঙ্ক থেকে আসে।
রবার্ট হার্ভে

আমরা আমাদের একই সমস্যাটি বর্ণনা করে একটি ব্লগ পোস্টের লিঙ্ক সহ প্রশ্নটি সম্পাদনা করেছি।
brien

মনে হচ্ছে কনটেইনস () আপনার টিকিট। তবে জোন স্কিট যেমন উল্লেখ করেছেন, কন্টেন্টগুলি আপনার প্রয়োজনীয়তা পূরণ না করে, আপনাকে সরাসরি ডাটাবেস ম্যানিপুলেট করে কিছু সত্য এসকিউএল নামাতে হতে পারে।
রবার্ট হার্ভে

2

আপনি যদি এমএস এসকিউএল ব্যবহার করে থাকেন তবে ওয়াইল্ডকার্ড অনুসন্ধানের জন্য% চরিত্রটিকে সমর্থন করার জন্য আমি 2 টি এক্সটেনশন পদ্ধতি লিখেছি। (লিনককিট প্রয়োজনীয়)

public static class ExpressionExtension
{
    public static Expression<Func<T, bool>> Like<T>(Expression<Func<T, string>> expr, string likeValue)
    {
        var paramExpr = expr.Parameters.First();
        var memExpr = expr.Body;

        if (likeValue == null || likeValue.Contains('%') != true)
        {
            Expression<Func<string>> valExpr = () => likeValue;
            var eqExpr = Expression.Equal(memExpr, valExpr.Body);
            return Expression.Lambda<Func<T, bool>>(eqExpr, paramExpr);
        }

        if (likeValue.Replace("%", string.Empty).Length == 0)
        {
            return PredicateBuilder.True<T>();
        }

        likeValue = Regex.Replace(likeValue, "%+", "%");

        if (likeValue.Length > 2 && likeValue.Substring(1, likeValue.Length - 2).Contains('%'))
        {
            likeValue = likeValue.Replace("[", "[[]").Replace("_", "[_]");
            Expression<Func<string>> valExpr = () => likeValue;
            var patExpr = Expression.Call(typeof(SqlFunctions).GetMethod("PatIndex",
                new[] { typeof(string), typeof(string) }), valExpr.Body, memExpr);
            var neExpr = Expression.NotEqual(patExpr, Expression.Convert(Expression.Constant(0), typeof(int?)));
            return Expression.Lambda<Func<T, bool>>(neExpr, paramExpr);
        }

        if (likeValue.StartsWith("%"))
        {
            if (likeValue.EndsWith("%") == true)
            {
                likeValue = likeValue.Substring(1, likeValue.Length - 2);
                Expression<Func<string>> valExpr = () => likeValue;
                var containsExpr = Expression.Call(memExpr, typeof(String).GetMethod("Contains",
                    new[] { typeof(string) }), valExpr.Body);
                return Expression.Lambda<Func<T, bool>>(containsExpr, paramExpr);
            }
            else
            {
                likeValue = likeValue.Substring(1);
                Expression<Func<string>> valExpr = () => likeValue;
                var endsExpr = Expression.Call(memExpr, typeof(String).GetMethod("EndsWith",
                    new[] { typeof(string) }), valExpr.Body);
                return Expression.Lambda<Func<T, bool>>(endsExpr, paramExpr);
            }
        }
        else
        {
            likeValue = likeValue.Remove(likeValue.Length - 1);
            Expression<Func<string>> valExpr = () => likeValue;
            var startsExpr = Expression.Call(memExpr, typeof(String).GetMethod("StartsWith",
                new[] { typeof(string) }), valExpr.Body);
            return Expression.Lambda<Func<T, bool>>(startsExpr, paramExpr);
        }
    }

    public static Expression<Func<T, bool>> AndLike<T>(this Expression<Func<T, bool>> predicate, Expression<Func<T, string>> expr, string likeValue)
    {
        var andPredicate = Like(expr, likeValue);
        if (andPredicate != null)
        {
            predicate = predicate.And(andPredicate.Expand());
        }
        return predicate;
    }

    public static Expression<Func<T, bool>> OrLike<T>(this Expression<Func<T, bool>> predicate, Expression<Func<T, string>> expr, string likeValue)
    {
        var orPredicate = Like(expr, likeValue);
        if (orPredicate != null)
        {
            predicate = predicate.Or(orPredicate.Expand());
        }
        return predicate;
    }
}

ব্যবহার

var orPredicate = PredicateBuilder.False<People>();
orPredicate = orPredicate.OrLike(per => per.Name, "He%llo%");
orPredicate = orPredicate.OrLike(per => per.Name, "%Hi%");

var predicate = PredicateBuilder.True<People>();
predicate = predicate.And(orPredicate.Expand());
predicate = predicate.AndLike(per => per.Status, "%Active");

var list = dbContext.Set<People>().Where(predicate.Expand()).ToList();    

ef6 এ এবং এটিতে অনুবাদ করা উচিত

....
from People per
where (
    patindex(@p__linq__0, per.Name) <> 0
    or per.Name like @p__linq__1 escape '~'
) and per.Status like @p__linq__2 escape '~'

', @ p__linq__0 ='% তিনি% llo% ', @ p__linq__1 ='% হাই% ', @ পি__লিংক_2 ='% সক্রিয় '


আপনার মন্তব্যের জন্য ধন্যবাদ রোনেল, আমি কি কিছু সাহায্য করতে পারি? ত্রুটি বার্তা কি?
স্টিভেন চং 8

2

ইফকোরের জন্য এখানে লাইক এক্সপ্রেশন তৈরির একটি নমুনা

protected override Expression<Func<YourEntiry, bool>> BuildLikeExpression(string searchText)
    {
        var likeSearch = $"%{searchText}%";

        return t => EF.Functions.Like(t.Code, likeSearch)
                    || EF.Functions.Like(t.FirstName, likeSearch)
                    || EF.Functions.Like(t.LastName, likeSearch);
    }

//Calling method

var query = dbContext.Set<YourEntity>().Where(BuildLikeExpression("Text"));

0

আপনি খুব সহজেই প্রতিষ্ঠানের লিঙ্কে কোনও বাস্তবের মতো ব্যবহার করতে পারেন

অ্যাড

    <Function Name="String_Like" ReturnType="Edm.Boolean">
      <Parameter Name="searchingIn" Type="Edm.String" />
      <Parameter Name="lookingFor" Type="Edm.String" />
      <DefiningExpression>
        searchingIn LIKE lookingFor
      </DefiningExpression>
    </Function>

এই ট্যাগে আপনার EDMX- তে

এডিএমএক্স: এডিএমএক্স / এডিএমএক্স: রানটাইম / এডিএমএক্স: কনসেপ্টুয়ালমোডেলস / স্কিমা

<schema namespace="" />বৈশিষ্ট্যের মধ্যে নাম স্থানটিও মনে রাখবেন

তারপরে উপরের নেমস্পেসে একটি এক্সটেনশন ক্লাস যুক্ত করুন:

public static class Extensions
{
    [EdmFunction("DocTrails3.Net.Database.Models", "String_Like")]
    public static Boolean Like(this String searchingIn, String lookingFor)
    {
        throw new Exception("Not implemented");
    }
}

এই এক্সটেনশন পদ্ধতিটি এখন EDMX ফাংশনে মানচিত্র করবে।

এখানে আরও তথ্য: http://jendaperl.blogspot.be/2011/02/ Like-in-linq-to-entities.html

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