সত্তা ফ্রেমওয়ার্কে কোনও অবজেক্ট বিদ্যমান কিনা তা যাচাই করার সর্বোত্তম উপায়?


114

পারফরম্যান্সের দৃষ্টিকোণ থেকে ডাটাবেসে কোনও বস্তুর উপস্থিতি রয়েছে কিনা তা যাচাই করার সর্বোত্তম উপায় কী? আমি সত্তা ফ্রেমওয়ার্ক 1.0 ব্যবহার করছি (ASP.NET 3.5 এসপি 1)।

উত্তর:


228

আপনি যদি এসকিউএল সরাসরি চালিত করতে না চান তবে সবচেয়ে ভাল উপায় হ'ল যে কোনও () ব্যবহার করা । এটি কারণ কারণ যে কোনও () এটি মিল খুঁজে পাওয়ার সাথে সাথে ফিরে আসবে। আরেকটি বিকল্প হ'ল কাউন্ট () , তবে ফিরে আসার আগে প্রতিটি সারি পরীক্ষা করতে হবে।

এটি কীভাবে ব্যবহার করা যায় তার একটি উদাহরণ এখানে:

if (context.MyEntity.Any(o => o.Id == idToMatch))
{
    // Match!
}

এবং ভিবি.নেটে

If context.MyEntity.Any(function(o) o.Id = idToMatch) Then
    ' Match!
End If

এবং ভিবিতে যদি (প্রাসঙ্গিক.মাইটিটিটি.আনি (o => o.Id <> idToMAtch)) তারপরে 'এটি একটি মিল! শেষ যদি দুঃখিত, এটি কোড ট্যাগে নেই, কীভাবে করব তা আমি বুঝতে পারি না!
কেভিন মরিসিস

ভাবেন আপনার অর্থ o.Id <> idToMatch একটি ম্যাচের সমান নয়
কলিন

আমি যদি নাম অনুসারে অনুসন্ধান করি এবং আইডিটি বিদ্যমান থাকে তবে আমি তা পেতে চাই?
মিহাই ব্রাটুলেসকু

ওহে. এটি বিদ্যমান কিনা তা আমরা কীভাবে পরীক্ষা করতে পারি এবং তার পরে তার সমস্ত ডেটা নির্বাচন করে?
ভ্যাচুসো

1
@ বার্নস যদি আপনি Tএমন কোনও ইন্টারফেসের প্রতি সীমাবদ্ধ থাকেন IEnumerableএবং যা রয়েছে এমন একটি বস্তু ফেরত দেয় তবে Idআপনার জেনেরিক ফাংশনটি ব্যবহার করতে সক্ষম হওয়া উচিত IsExists<T>()
সানক্যাট 2000

9

পারফরম্যান্সের দৃষ্টিকোণ থেকে, আমি অনুমান করি যে উপস্থিত থাকা কমান্ডটি ব্যবহার করে সরাসরি এসকিউএল কোয়েরি উপযুক্ত হবে appropriate এখানে সত্তা ফ্রেমওয়ার্ক সরাসরি SQL এর কিভাবে চালানো জন্য দেখুন: http://blogs.microsoft.co.il/blogs/gilf/archive/2009/11/25/execute-t-sql-statements-in-entity-framework- 4.aspx


হ্যাঁ, ভাল ধারণা তবে আমি সত্তা কাঠামোর আগের সংস্করণে সীমাবদ্ধ।
ফ্রেডি

5

আমাকে এমন একটি দৃশ্য পরিচালনা করতে হয়েছিল যেখানে নতুন ডেটা রেকর্ডে ডুপ্লিকেট সরবরাহের শতাংশের পরিমাণ খুব বেশি ছিল এবং ডুপ্লিকেটগুলি পরীক্ষা করার জন্য বহু হাজারে ডাটাবেস কল করা হয়েছিল (সুতরাং সিপিইউ 100% এ অনেক সময় প্রেরণ করেছিল)। শেষ পর্যন্ত আমি স্থির করেছিলাম 100,000 সর্বশেষ রেকর্ড স্মরণে রাখা আছে ached এসকিউএল ডাটাবেসের বিপরীতে লিনকিউয়ের সাথে তুলনা করার সময় আমি ক্যাশেড রেকর্ডগুলির বিপরীতে ডুপ্লিকেটগুলি পরীক্ষা করতে পারি এবং তারপরে ডাটাবেসে কোনও সত্যিকারের নতুন রেকর্ড লিখি (পাশাপাশি সেগুলি ডেটা ক্যাশে যুক্ত করি, যা আমিও এর দৈর্ঘ্য পরিচালনাযোগ্য রাখতে বাছাই এবং ছাঁটা হয়েছে)।

দ্রষ্টব্য যে কাঁচা ডেটা একটি সিএসভি ফাইল ছিল যাতে অনেকগুলি পৃথক রেকর্ড রয়েছে যা পার্স করতে হয়েছিল। প্রতিটি টানা ফাইলের রেকর্ডগুলি (যা প্রতি 5 মিনিটে প্রায় 1 হারে আসে) যথেষ্ট পরিমাণে ওভারল্যাপ করে, তাই ডুপ্লিকেটের উচ্চ শতাংশ।

সংক্ষেপে, আপনার যদি টাইমস্ট্যাম্প করা কাঁচা ডেটা আসছে, বেশ কিছুটা যথাযথভাবে, তবে মেমোরি ক্যাশে ব্যবহার করা রেকর্ড সদৃশতা পরীক্ষায় সহায়তা করতে পারে।


2
আমরা বিকাশকারীরা আপনার দৃশ্যের সাথে অনেক সময় উপস্থিত হয়ে কিছুটা মোচড়ের সাথে থাকতে পারি। আমি আপনাকে সি # তে আপনার সমাধানটি অনুবাদ করার জন্য অনুরোধ করতে চাই যাতে আমরা এবং অনেক আগত বিকাশকারীরা উপকৃত হবেন। +1 টি। আমি সমাধানটি একটি ব্লগ পোস্ট পর্যন্ত প্রসারিত পছন্দ করব! :)
সংগম

3

আমি জানি এটি একটি খুব পুরানো থ্রেড তবে কেবল নিজের মতো কারোরই এই সমাধানটির প্রয়োজন হয় তবে ভিবি.নেটে এখানে উপরের উত্তরের ভিত্তিতে আমি কী ব্যবহার করেছি তা এখানে রয়েছে।

Private Function ValidateUniquePayroll(PropertyToCheck As String) As Boolean
    // Return true if Username is Unique
    Dim rtnValue = False
    Dim context = New CPMModel.CPMEntities
    If (context.Employees.Any()) Then ' Check if there are "any" records in the Employee table
        Dim employee = From c In context.Employees Select c.PayrollNumber ' Select just the PayrollNumber column to work with
        For Each item As Object In employee ' Loop through each employee in the Employees entity
            If (item = PropertyToCheck) Then ' Check if PayrollNumber in current row matches PropertyToCheck
                // Found a match, throw exception and return False
                rtnValue = False
                Exit For
            Else
                // No matches, return True (Unique)
                rtnValue = True
            End If
        Next
    Else
        // The is currently no employees in the person entity so return True (Unqiue)
        rtnValue = True
    End If
    Return rtnValue
End Function

আমি ভিবিতে লাম্বদা কীভাবে ব্যবহার করব তা জানি না তবে সি # তে এটি সমান: প্রত্যাবর্তন! প্রেক্ষাপট mp এমপ্লয়েইস ny এটি মেমরির মধ্য দিয়ে লুপিংয়ের পরে সমস্ত ফলাফল ফিরিয়ে এড়াতে পারে।
কলিন

1
@ কলিন এটি একটি ভাল অ্যাডিশন যা আমি উপরের কোডের সাথে মেমরির সমস্যাটিকে উপেক্ষা করেছি, ভিবিতে কোডটি প্রসঙ্গ। এমপ্লয়েস। আমি এখন এটি আমার কোডে যুক্ত করেছি।
কেভিন মরিসিস

কেভিন, আমি মনে করি আপনাকে ফিরে যেতে হবে এবং আপনার কোডটি ঠিক করতে হতে পারে। কোনও যুক্তিযুক্ত পেওরল নম্বর না থাকলে সত্যের চেয়ে সত্যিকারের চেয়ে যদি কোনও প্যারোল নম্বর মেলে না তবে আপনার যুক্তিটি অবশ্যই সত্য প্রত্যাবর্তন করবে।
কলিন

@ কলিন দুঃখিত, আপনি ঠিক বলেছেন, আমি আপনার উদাহরণটিতে একটি ভিবি সংস্করণ সরবরাহ করছিলাম কেবলমাত্র আমি সি সি ঠিক করি না এবং ভেবেছিলেন == আমার ভিবি <> এর সমান নয়।
কেভিন মরিসিস

1
@ কেভিনমরিসি আমার ধারণা কলিং বলছিল যে আপনাকে "প্রসঙ্গের" সামনে "নট" রাখার দরকার আছে। যেহেতু "ফিরে না context.Employees.Any (গ => c.PayrollNumber = PropertyToCheck)" নয় (আমি আবার বলছি), IS না হিসাবে একই "আসতে context.Employees.Any (গ <> c.PayrollNumber = PropertyToCheck)" । আপনি আমার বিন্দু দেখতে পাচ্ছি? "রিটার্ন যেকোনো <>" ব্যবহারের অর্থ আপনি যদি এই সংখ্যার সাথে মেলে না এমন কোনও কিছু খুঁজে পান (কোনও মিলের একটি উপস্থিত রয়েছে এমনকি), যা-ই হোক না কেন সত্য ফিরে আসবে। পরিবর্তে, "নয় [...] ব্যবহার করুন। যেকোন =" কেবল তখনই সত্যটি ফিরে আসবে যখন এটি আপনি সারিটি সন্ধান করছেন না! আপনি পার্থক্য দেখতে পান কি?
এরক্স_ভিবি.এনএক্সটি.কোডার

2

আমার এটি নিয়ে কিছুটা সমস্যা হয়েছিল - আমার এন্টিকিতে তিনটি বৈশিষ্ট্য রয়েছে (3 টি কলাম সহ পিকে) এবং আমি কলামগুলির প্রত্যেকটি চেক করতে চাইনি কারণ এটি কুৎসিত হবে। আমি এমন একটি সমাধান সম্পর্কে ভাবলাম যা সমস্ত সত্তা নিয়ে সর্বদা কাজ করে।

এর আর একটি কারণ হ'ল আমি প্রতিবার আপডেটএক্সেপশন ধরতে পছন্দ করি না।

মূল বৈশিষ্ট্যের মানগুলি পেতে কিছুটা প্রতিফলন প্রয়োজন।

কোডটি এক্সটেনশন হিসাবে প্রয়োগটি সহজ হিসাবে ব্যবহার করা হয়েছে:

context.EntityExists<MyEntityType>(item);

একবার দেখুন:

public static bool EntityExists<T>(this ObjectContext context, T entity)
        where T : EntityObject
    {
        object value;
        var entityKeyValues = new List<KeyValuePair<string, object>>();
        var objectSet = context.CreateObjectSet<T>().EntitySet;
        foreach (var member in objectSet.ElementType.KeyMembers)
        {
            var info = entity.GetType().GetProperty(member.Name);
            var tempValue = info.GetValue(entity, null);
            var pair = new KeyValuePair<string, object>(member.Name, tempValue);
            entityKeyValues.Add(pair);
        }
        var key = new EntityKey(objectSet.EntityContainer.Name + "." + objectSet.Name, entityKeyValues);
        if (context.TryGetObjectByKey(key, out value))
        {
            return value != null;
        }
        return false;
    }

1
আমি আমার উত্তরে একটি মন্তব্য যুক্ত করতে চাই যা এখন প্রায় 9 বছরের পুরানো। আমি মনে করি আজকাল সত্তা ফ্রেমওয়ার্ক ৪ এর সাথে ২০১০/২০১১ এর তুলনায় অনেক ক্লিনার সমাধান এবং সম্ভাবনা রয়েছে। সুতরাং আমি এই উত্তরটি ডাউন-ভোটিং বন্ধ করার পরিবর্তে নীচে একটি নতুন / আরও ভাল উত্তর যুক্ত করার পরামর্শ দেব।
সোভেন

দয়া করে মনে রাখবেন যে আমার সমাধানটি একটি জেনেরিক ছিল যা বিদ্যমান সারণী / এনটাইটগুলির সংযুক্ত কীগুলি সহ অনেক সত্তার জন্য কাজ করেছিল আমি পরিবর্তন করতে পারি নি। তাই সর্বদা জিজ্ঞাসা করার পরিবর্তে। 3 টি মূল বৈশিষ্ট্য সহ যে কোনও (...) আমি কেবল কল করেছিলাম ntতন্ত্রতাবাদী ()।
সোভেন

2

আমি কেবলমাত্র বস্তুটি শূন্য কিনা তা পরীক্ষা করে দেখি, এটি আমার জন্য 100% কাজ করে

    try
    {
        var ID = Convert.ToInt32(Request.Params["ID"]);
        var Cert = (from cert in db.TblCompCertUploads where cert.CertID == ID select cert).FirstOrDefault();
        if (Cert != null)
        {
            db.TblCompCertUploads.DeleteObject(Cert);
            db.SaveChanges();
            ViewBag.Msg = "Deleted Successfully";
        }
        else
        {
            ViewBag.Msg = "Not Found !!";
        }                           
    }
    catch
    {
        ViewBag.Msg = "Something Went wrong";
    }

0

কেন করবে না?

var result= ctx.table.Where(x => x.UserName == "Value").FirstOrDefault();

if(result?.field == value)
{
  // Match!
}

এটি একটি নাল রেফারেন্স ব্যতিক্রম ছুঁড়ে ফেলবে কারণ ফার্স্টঅরডেফল্ট () কোনও ফলাফল না পেলে নালাকে ফিরিয়ে দেবে। আমি অনুমান করি যে এড়াতে যদি আপনি (ফলাফল?। ফিল্ড == মান) করতে পারেন।
ToDevAnd পিছনে

এটি অকারণে ধীর হতে পারে যেহেতু এটি সত্তাটি লোড করে। আপনি যা করতে চান তা যদি কোনও কী উপস্থিত থাকে কি না তা পরীক্ষা করে দেখুন।
ডগলাস গ্যাসকেল

0

এটি করার সর্বোত্তম উপায়

আপনার অবজেক্টটি যা তা নির্বিশেষে এবং ডাটাবেসে কোন টেবিলের জন্য আপনার কেবলমাত্র জিনিসটি থাকা দরকার তা হল বস্তুর প্রাথমিক কী।

সি # কোড

var dbValue = EntityObject.Entry(obj).GetDatabaseValues();
if (dbValue == null)
{
   Don't exist
}

ভিবি.এনইটি কোড

Dim dbValue = EntityObject.Entry(obj).GetDatabaseValues()
If dbValue Is Nothing Then
   Don't exist
End If

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