লিনিকিউ থেকে সত্তা ক্ষেত্রে সংবেদনশীল তুলনা


115

এটি লিনকিউতে সত্তার সাথে কোনও ক্ষেত্রে সংবেদনশীল তুলনা নয়:

Thingies.First(t => t.Name == "ThingamaBob");

আমি কীভাবে সংস্থাগুলির সাথে লিনকিউয়ের সাথে সংবেদনশীল তুলনা করতে পারি?


@ রনি: আপনি কি সে সম্পর্কে নিশ্চিত? আপনি কেস সংবেদনশীল তুলনা মানে ?
মাইকেল পেট্রোটা 21

14
একেবারে নিশ্চিত. না আমি তা বোঝাতে চাই না।
রনি ওভারবি

12
না, আমার কম্পিউটারে EF 4.0 ডাব্লু / এসকিউএল সার্ভার 2008 আর 2 চলছে, উপরের ক্ষেত্রে সংবেদনশীল নয়। আমি জানি যে প্রচুর জায়গাগুলি বলে যে EF হ'ল ডিফল্ট কেস সংবেদনশীল তবে আমি যা অভিজ্ঞতা অর্জন করেছি তা নয়।
টেস্টার

3
এটি অন্তর্নিহিত ডাটাবেসের উপর নির্ভর করবে না?
কোডিমানিক্স

1
@ কোডিমানিক্স: এটি একটি ভাল প্রশ্ন! লিনক থেকে ইএফ কোনও ডিবি ক্যোয়ারির জন্য ল্যাম্বডা এক্সপ্রেশনটি অনুবাদ করে? আমি উত্তর জানি না।
টেরিভিভার

উত্তর:


163

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

অবজেক্টকোয়ারি.টোট্রেস স্ট্রিং ব্যবহার করে উত্পন্ন এসকিউএল কোয়েরিটি দেখতে যা আসলে এসকিউএল সার্ভারে জমা দেওয়া হয়েছে তা রহস্যটি প্রকাশ করে:

string sqlQuery = ((ObjectQuery)context.Thingies
        .Where(t => t.Name == "ThingamaBob")).ToTraceString();

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

সার্ভার পার্শ্ব সমাধান:

অতএব, সবচেয়ে ভালো সমাধান এর কোলেশন পরিবর্তন করতে হবে নাম কলাম টি অজানা ক্রমসজ্জিত সারণীর Latin1_General_CS_AS যে ক্ষেত্রে আপনার SQL সার্ভার এ এই চলমান দ্বারা সংবেদনশীল হল:

ALTER TABLE Thingies
ALTER COLUMN Name VARCHAR(25)
COLLATE Latin1_General_CS_AS

আরও তথ্যের জন্য SQL সার্ভার Collates এ এএ কটাক্ষপাত SQL সার্ভার কোলেট কেস সংবেদী SQL কোয়েরি অনুসন্ধান

ক্লায়েন্ট-পক্ষের সমাধান:

ক্লায়েন্টের পক্ষে আপনি যে একমাত্র সমাধানটি প্রয়োগ করতে পারবেন তা হ'ল লিনকিউকে অবজেক্টের কাছে আর একটি তুলনা করার জন্য ব্যবহার করা যা খুব মার্জিত বলে মনে হয় না:

Thingies.Where(t => t.Name == "ThingamaBob")
        .AsEnumerable()
        .First(t => t.Name == "ThingamaBob");

আমি সত্তা ফ্রেমওয়ার্ক সহ ডাটাবেস স্কিমা তৈরি করছি, তাই আমার কলিং কোড ব্যবহার করে একটি সমাধান সবচেয়ে ভাল হবে। আমার ধারণা ফলাফলগুলি ফিরে আসার পরে আমি একটি চেক করব। ধন্যবাদ।
রনি ওভারবাই

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

18
@ ইগ্লাসিয়াস এটি সম্পূর্ণ সত্য নয়: এটি সমস্ত তথ্য আনে না, সংবেদনশীলতার সাথে কেসের সাথে মেলে এমন ডেটা কেবল এনে দেয় এবং এর পরে এটি ক্লায়েন্টের ক্ষেত্রে সংবেদনশীলতার সাথে আবার ফিল্টার হয়ে যায়। অবশ্যই, যদি আপনি হাজার হাজার এন্ট্রিগুলি মেলে যা সংবেদনশীল না হয় তবে তার মধ্যে কেবল একটি সঠিক সংবেদনশীল, তবে এটি অনেকটা ওভারহেড। তবে আমি মনে করি না যে বাস্তবতা এমন পরিস্থিতি উপস্থাপন করবে ... :)
আচিম

1
@ মাসউদখারি আপনি যে সমাধানটি পোস্ট করেছেন তা এটি কেস সংবেদনশীল করে তুলবে কারণ আপনি তুলনার উভয় পক্ষকে কম আবদ্ধ করছেন। ওপির ক্ষেত্রে কেস সংবেদনশীল তুলনা দরকার।
জনি

1
"অতএব, থিংস টেবিলের নাম কলামের কোলেশনটি কলিনেট ল্যাটিন 1_ জেনারেল_সিএস_এএস-তে পরিণত করার সর্বোত্তম সমাধান হ'ল - আমি মনে করি না যে এটি সেরা। বেশিরভাগ সময় আমার কেস সংবেদনশীল লাইক ফিল্টার (.Contains ()) দরকার হয় তবে কখনও কখনও এটি সংবেদনশীল হওয়া উচিত be আমি আপনার "ক্লায়েন্ট-সাইড সলিউশন" চেষ্টা করব - এটি আমার ব্যবহারের ক্ষেত্রে অনেক বেশি মার্জিত বলে আমি মনে করি (এটি কী করে তা বুঝতে পেরে ভাল লাগবে তবে আপনার এটি সব থাকতে পারে না :))।
অবিশ্বাস্য জানুয়ারী

11

আপনি EF6 + কোড-প্রথমটির জন্য [কেস সংবেদনশীল] টীকা যুক্ত করতে পারেন

এই ক্লাস যুক্ত করুন

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true)]
public class CaseSensitiveAttribute : Attribute
{
    public CaseSensitiveAttribute()
    {
        IsEnabled = true;
    }
    public bool IsEnabled { get; set; }
}

public class CustomSqlServerMigrationSqlGenerator : SqlServerMigrationSqlGenerator
{
    protected override void Generate(AlterColumnOperation alterColumnOperation)
    {
        base.Generate(alterColumnOperation);
        AnnotationValues values;
        if (alterColumnOperation.Column.Annotations.TryGetValue("CaseSensitive", out values))
        {
            if (values.NewValue != null && values.NewValue.ToString() == "True")
            {
                using (var writer = Writer())
                {
                    //if (System.Diagnostics.Debugger.IsAttached == false) System.Diagnostics.Debugger.Launch();

                    // https://github.com/mono/entityframework/blob/master/src/EntityFramework.SqlServer/SqlServerMigrationSqlGenerator.cs
                    var columnSQL = BuildColumnType(alterColumnOperation.Column); //[nvarchar](100)
                    writer.WriteLine(
                        "ALTER TABLE {0} ALTER COLUMN {1} {2} COLLATE SQL_Latin1_General_CP1_CS_AS {3}",
                        alterColumnOperation.Table,
                        alterColumnOperation.Column.Name,
                        columnSQL,
                        alterColumnOperation.Column.IsNullable.HasValue == false || alterColumnOperation.Column.IsNullable.Value == true ? " NULL" : "NOT NULL" //todo not tested for DefaultValue
                        );
                    Statement(writer);
                }
            }
        }
    }
}

public class CustomApplicationDbConfiguration : DbConfiguration
{
    public CustomApplicationDbConfiguration()
    {
        SetMigrationSqlGenerator(
            SqlProviderServices.ProviderInvariantName,
            () => new CustomSqlServerMigrationSqlGenerator());
    }
}

আপনার DbContext সংশোধন করুন, যোগ করুন

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Add(new AttributeToColumnAnnotationConvention<CaseSensitiveAttribute, bool>(
                "CaseSensitive",
                (property, attributes) => attributes.Single().IsEnabled));
        base.OnModelCreating(modelBuilder);
    }

তাহলে কর

অ্যাড-মাইগ্রেশন কেস সেনসিটিভ

আপডেট ডাটাবেস

https://milinaudara.wordpress.com/2015/02/04/ কেস-সেনসেটিভ- অনুসন্ধান-ব্যবহার- entity- framework- with-custom-annotation/ উপর নিবন্ধ ভিত্তিক কিছু বাগ ফিক্স


11

WHEREএসকিউএল সার্ভারের শর্তগুলি ডিফল্টরূপে সংবেদনশীল নয়। কলামটির ডিফল্ট কোলিশন ( SQL_Latin1_General_CP1_CI_AS) এ পরিবর্তন করে কেসটিকে সংবেদনশীল করুন SQL_Latin1_General_CP1_CS_AS

এটি করার ভঙ্গুর উপায় কোড সহ। একটি নতুন স্থানান্তর ফাইল যুক্ত করুন এবং তারপরে এটি Upপদ্ধতির অভ্যন্তরে যুক্ত করুন :

public override void Up()
{
   Sql("ALTER TABLE Thingies ALTER COLUMN Name VARCHAR(MAX) COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL");
}

কিন্তু

আপনি নতুন EF6 বৈশিষ্ট্য ব্যবহার করে "কেস সংবেদনশীল" নামে কাস্টম টিকা তৈরি করতে পারেন এবং আপনি নিজের বৈশিষ্ট্যগুলি এর মতো সাজাতে পারেন:

[CaseSensitive]
public string Name { get; set; }

কীভাবে এটি করা যায় এই ব্লগ পোস্টটি ব্যাখ্যা করে।


এই নিবন্ধটিতে একটি বাগ রয়েছে
রাউআর

3

@ মর্তেজা মানাভির দেওয়া উত্তরটি সমস্যার সমাধান করে। তবুও, ক্লায়েন্ট-পার্শ্ব সমাধানের জন্য , একটি মার্জিত উপায় নিম্নলিখিত হবে (একটি ডাবল চেক যোগ করা)।

var firstCheck = Thingies.Where(t => t.Name == "ThingamaBob")
    .FirstOrDefault();
var doubleCheck = (firstCheck?.Name == model.Name) ? Thingies : null;

-4

আমি মুর্তিজার উত্তর পছন্দ করেছি এবং সাধারণত সার্ভারের দিক থেকে ঠিক করতে পছন্দ করি। ক্লায়েন্ট-পক্ষের জন্য আমি সাধারণত:

Dim bLogin As Boolean = False

    Dim oUser As User = (From c In db.Users Where c.Username = UserName AndAlso c.Password = Password Select c).SingleOrDefault()
    If oUser IsNot Nothing Then
        If oUser.Password = Password Then
            bLogin = True
        End If
    End If

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


2
এই উত্তরটি বোঝায় যে আপনি আপনার ডাটাবেসে সরল পাঠ্য হিসাবে পাসওয়ার্ড সংরক্ষণ করছেন যা একটি বিশাল সুরক্ষার দুর্বলতা।
জেসন কোয়েেন

2
@ জেসনকোয়েন যে পাসওয়ার্ডের সাথে তার তুলনা করছেন তা ইতিমধ্যে হ্যাশ করা যেতে পারে
পিটার মরিস

-4

কেউই StringComparison.IgnoreCaseআমার পক্ষে কাজ করেনি । তবে এটি করেছে:

context.MyEntities.Where(p => p.Email.ToUpper().Equals(muser.Email.ToUpper()));

2
এটি যে প্রশ্ন জিজ্ঞাসা করা হয়েছিল, যা,How can I achieve case sensitive comparison
রেজিট

-4

স্ট্রিং.একুয়ালস ব্যবহার করুন

Thingies.First(t => string.Equals(t.Name, "ThingamaBob", StringComparison.CurrentCulture);

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

সংক্ষিপ্ত সংবেদনশীলতার জন্য স্ট্রিংকম্পারেশন.কেনক্র্যান্ট কালচারআইগনরেস কেস ব্যবহার করুন।

Thingies.First(t => string.Equals(t.Name, "ThingamaBob", StringComparison.CurrentCultureIgnoreCase);

সমান () এসকিউএল তে রূপান্তর করা যায় না ... এছাড়াও আপনি যদি উদাহরণ পদ্ধতিটি ব্যবহার করে এবং ব্যবহার করেন তবে স্ট্রিংকম্পিয়ারটি উপেক্ষা করা হবে।
এলএমকে

আপনি কি এই সমাধান চেষ্টা করেছেন? আমি এএফ এর সাথে সূক্ষ্মভাবে কাজ করার চেষ্টা করেছি tried
দর্শন যোশি

-6

EF4 সম্পর্কে নিশ্চিত নয়, তবে EF5 এটি সমর্থন করে:

Thingies
    .First(t => t.Name.Equals(
        "ThingamaBob",
        System.StringComparison.InvariantCultureIgnoreCase)

উত্সাহিত কি কি বর্গফুট উত্পন্ন।
রনি ওভারবি

আমি এটি EF5 দিয়ে যাচাই করেছি, এটি এসকিউএল-তে কেবল একটি WHERE ... = ... তৈরি করেছে। আবার, এটি এসকিউএল সার্ভারের পাশের কোলেশন সেটিংসের উপর নির্ভরশীল।
আচিম

এমনকি ডিবিতে কেস-সেনসিটিভ কোলেশন থাকা সত্ত্বেও আমি এটি বা অন্য কোনও StringComparisonএনামকে কোনও পার্থক্য করতে পারি না। আমি জিনিস এই ধরনের পরামর্শ ভাবতে সমস্যা EDMX ফাইলে কোথাও (ডিবি-প্রথম) কাজ করা উচিত যথেষ্ট মানুষ দেখা করেছি, যদিও stackoverflow.com/questions/841226/...
drzaus
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.