এটি লিনকিউতে সত্তার সাথে কোনও ক্ষেত্রে সংবেদনশীল তুলনা নয়:
Thingies.First(t => t.Name == "ThingamaBob");
আমি কীভাবে সংস্থাগুলির সাথে লিনকিউয়ের সাথে সংবেদনশীল তুলনা করতে পারি?
এটি লিনকিউতে সত্তার সাথে কোনও ক্ষেত্রে সংবেদনশীল তুলনা নয়:
Thingies.First(t => t.Name == "ThingamaBob");
আমি কীভাবে সংস্থাগুলির সাথে লিনকিউয়ের সাথে সংবেদনশীল তুলনা করতে পারি?
উত্তর:
এর কারণ আপনি লিনকিউটি সত্তাগুলিতে ব্যবহার করছেন যা শেষ পর্যন্ত আপনার ল্যাম্বদা এক্সপ্রেশনগুলি এসকিউএল স্টেটমেন্টে রূপান্তর করে। এর অর্থ কেস সংবেদনশীলতাটি আপনার এসকিউএল সার্ভারের করুণায় রয়েছে যা ডিফল্টরূপে এসকিউএল_ল্যাটিন 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");
আপনি 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/ উপর নিবন্ধ ভিত্তিক কিছু বাগ ফিক্স
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; }
কীভাবে এটি করা যায় এই ব্লগ পোস্টটি ব্যাখ্যা করে।
@ মর্তেজা মানাভির দেওয়া উত্তরটি সমস্যার সমাধান করে। তবুও, ক্লায়েন্ট-পার্শ্ব সমাধানের জন্য , একটি মার্জিত উপায় নিম্নলিখিত হবে (একটি ডাবল চেক যোগ করা)।
var firstCheck = Thingies.Where(t => t.Name == "ThingamaBob")
.FirstOrDefault();
var doubleCheck = (firstCheck?.Name == model.Name) ? Thingies : null;
আমি মুর্তিজার উত্তর পছন্দ করেছি এবং সাধারণত সার্ভারের দিক থেকে ঠিক করতে পছন্দ করি। ক্লায়েন্ট-পক্ষের জন্য আমি সাধারণত:
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
মূলত, প্রয়োজনীয় মানদণ্ড সহ কোনও ব্যবহারকারী আছে কিনা তা আগে পরীক্ষা করে দেখুন, তারপরে পাসওয়ার্ডটি একই কিনা তা পরীক্ষা করে দেখুন। কিছুটা লম্বা-বাতাসযুক্ত, তবে আমি মনে করি এটি পড়তে আরও সহজ হয় যখন জড়িত মানদণ্ডের সাথে জড়িত থাকতে পারে।
কেউই StringComparison.IgnoreCase
আমার পক্ষে কাজ করেনি । তবে এটি করেছে:
context.MyEntities.Where(p => p.Email.ToUpper().Equals(muser.Email.ToUpper()));
How can I achieve case sensitive comparison
স্ট্রিং.একুয়ালস ব্যবহার করুন
Thingies.First(t => string.Equals(t.Name, "ThingamaBob", StringComparison.CurrentCulture);
এছাড়াও, আপনাকে নাল সম্পর্কে উদ্বিগ্ন হওয়ার দরকার নেই এবং কেবল আপনার পছন্দসই তথ্য ফিরে পাওয়া উচিত।
সংক্ষিপ্ত সংবেদনশীলতার জন্য স্ট্রিংকম্পারেশন.কেনক্র্যান্ট কালচারআইগনরেস কেস ব্যবহার করুন।
Thingies.First(t => string.Equals(t.Name, "ThingamaBob", StringComparison.CurrentCultureIgnoreCase);
EF4 সম্পর্কে নিশ্চিত নয়, তবে EF5 এটি সমর্থন করে:
Thingies
.First(t => t.Name.Equals(
"ThingamaBob",
System.StringComparison.InvariantCultureIgnoreCase)
StringComparison
এনামকে কোনও পার্থক্য করতে পারি না। আমি জিনিস এই ধরনের পরামর্শ ভাবতে সমস্যা EDMX ফাইলে কোথাও (ডিবি-প্রথম) কাজ করা উচিত যথেষ্ট মানুষ দেখা করেছি, যদিও stackoverflow.com/questions/841226/...