วิธีใดที่ดีที่สุดในการตรวจสอบว่ามีวัตถุอยู่ในฐานข้อมูลจากมุมมองด้านประสิทธิภาพหรือไม่ ฉันใช้ Entity Framework 1.0 (ASP.NET 3.5 SP1)
วิธีใดที่ดีที่สุดในการตรวจสอบว่ามีวัตถุอยู่ในฐานข้อมูลจากมุมมองด้านประสิทธิภาพหรือไม่ ฉันใช้ Entity Framework 1.0 (ASP.NET 3.5 SP1)
คำตอบ:
หากคุณไม่ต้องการที่จะดำเนินการ SQL โดยตรงวิธีที่ดีที่สุดคือการใช้ใด ๆ () เนื่องจาก Any () จะกลับมาทันทีที่พบรายการที่ตรงกัน อีกทางเลือกหนึ่งคือCount ()แต่อาจต้องตรวจสอบทุกแถวก่อนกลับ
นี่คือตัวอย่างวิธีการใช้งาน:
if (context.MyEntity.Any(o => o.Id == idToMatch))
{
// Match!
}
และใน vb.net
If context.MyEntity.Any(function(o) o.Id = idToMatch) Then
' Match!
End If
T
อินเทอร์เฟซที่เป็นIEnumerable
และส่งคืนอ็อบเจ็กต์ที่มี an Id
คุณควรจะสามารถใช้ฟังก์ชันทั่วไปของคุณIsExists<T>()
ได้
จากมุมมองด้านประสิทธิภาพฉันเดาว่าแบบสอบถาม SQL โดยตรงโดยใช้คำสั่งEXISTSน่าจะเหมาะสม ดูวิธีดำเนินการ SQL โดยตรงใน Entity Framework ได้ที่นี่: http://blogs.microsoft.co.il/blogs/gilf/archive/2009/11/25/execute-t-sql-statements-in-entity-framework- 4.aspx
ฉันต้องจัดการสถานการณ์ที่เปอร์เซ็นต์ของรายการซ้ำที่ให้ไว้ในบันทึกข้อมูลใหม่นั้นสูงมากและมีการเรียกฐานข้อมูลจำนวนมากเพื่อตรวจสอบรายการที่ซ้ำกัน (ดังนั้น CPU จึงส่งเวลามากที่ 100%) ในที่สุดฉันตัดสินใจเก็บบันทึก 100,000 รายการล่าสุดไว้ในหน่วยความจำ ด้วยวิธีนี้ฉันสามารถตรวจสอบรายการที่ซ้ำกันกับระเบียนแคชซึ่งเร็วมากเมื่อเทียบกับแบบสอบถาม LINQ กับฐานข้อมูล SQL จากนั้นเขียนบันทึกใหม่ ๆ ลงในฐานข้อมูล (รวมทั้งเพิ่มลงในแคชข้อมูลซึ่งฉันก็เช่นกัน จัดเรียงและตัดแต่งเพื่อให้สามารถจัดการความยาวได้)
โปรดทราบว่าข้อมูลดิบเป็นไฟล์ CSV ที่มีระเบียนแต่ละรายการจำนวนมากที่ต้องแยกวิเคราะห์ บันทึกในแต่ละไฟล์ติดต่อกัน (ซึ่งมาในอัตราประมาณ 1 ทุก 5 นาที) ทับซ้อนกันมากดังนั้นจึงมีเปอร์เซ็นต์ที่ซ้ำกันสูง
ในระยะสั้นหากคุณมีข้อมูลดิบที่ประทับเวลาเข้ามาในลำดับค่อนข้างมากการใช้แคชหน่วยความจำอาจช่วยในการตรวจสอบการทำสำเนาเรกคอร์ด
ฉันรู้ว่านี่เป็นกระทู้เก่ามาก แต่ในกรณีที่คนอย่างฉันต้องการวิธีแก้ปัญหานี้ แต่ใน VB.NET นี่คือสิ่งที่ฉันใช้ตามคำตอบข้างต้น
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
ฉันมีปัญหากับสิ่งนี้ - EntityKey ของฉันประกอบด้วยสามคุณสมบัติ (PK ที่มี 3 คอลัมน์) และฉันไม่ต้องการตรวจสอบแต่ละคอลัมน์เพราะมันจะน่าเกลียด ฉันคิดถึงวิธีแก้ปัญหาที่ใช้ได้กับทุกเอนทิตี
อีกเหตุผลหนึ่งคือฉันไม่ชอบที่จะจับ UpdateExceptions ทุกครั้ง
จำเป็นต้องมีการสะท้อนกลับเล็กน้อยเพื่อให้ได้ค่าของคุณสมบัติหลัก
มีการนำโค้ดมาใช้เป็นส่วนเสริมเพื่อลดความซับซ้อนในการใช้งานดังนี้
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;
}
ฉันแค่ตรวจสอบว่าออบเจ็กต์เป็นโมฆะมันใช้งานได้ 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";
}
ทำไมไม่ทำล่ะ?
var result= ctx.table.Where(x => x.UserName == "Value").FirstOrDefault();
if(result?.field == value)
{
// Match!
}
ไม่ว่าวัตถุของคุณคืออะไรและตารางใดในฐานข้อมูลสิ่งเดียวที่คุณต้องมีคือคีย์หลักในออบเจ็กต์
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