Jawaban:
Jika Anda tidak ingin mengeksekusi SQL secara langsung, cara terbaik adalah menggunakan Any () . Ini karena Any () akan kembali segera setelah menemukan kecocokan. Opsi lainnya adalah Count () , tetapi ini mungkin perlu memeriksa setiap baris sebelum kembali.
Berikut contoh cara menggunakannya:
if (context.MyEntity.Any(o => o.Id == idToMatch))
{
// Match!
}
Dan di vb.net
If context.MyEntity.Any(function(o) o.Id = idToMatch) Then
' Match!
End If
T
ke antarmuka yaitu IEnumerable
dan mengembalikan objek yang berisi Id
, Anda harus dapat menggunakan fungsi umum Anda IsExists<T>()
.
Dari sudut pandang kinerja, saya rasa kueri SQL langsung menggunakan perintah EXISTS akan sesuai. Lihat di sini untuk mengetahui cara menjalankan SQL secara langsung di Entity Framework: http://blogs.microsoft.co.il/blogs/gilf/archive/2009/11/25/execute-t-sql-statements-in-entity-framework- 4.aspx
Saya harus mengelola skenario di mana persentase duplikat yang diberikan dalam catatan data baru sangat tinggi, dan ribuan panggilan database dilakukan untuk memeriksa duplikat (sehingga CPU mengirimkan banyak waktu pada 100%). Pada akhirnya saya memutuskan untuk menyimpan 100.000 catatan terakhir dalam cache dalam memori. Dengan cara ini saya dapat memeriksa duplikat terhadap catatan cache yang sangat cepat jika dibandingkan dengan kueri LINQ terhadap database SQL, dan kemudian menulis catatan yang benar-benar baru ke database (serta menambahkannya ke cache data, yang saya juga diurutkan dan dipangkas agar panjangnya dapat diatur).
Perhatikan bahwa data mentah adalah file CSV yang berisi banyak catatan individu yang harus diurai. Catatan di setiap file berturut-turut (yang datang dengan kecepatan sekitar 1 setiap 5 menit) sangat tumpang tindih, karenanya tingginya persentase duplikat.
Singkatnya, jika Anda memiliki data mentah dengan stempel waktu yang masuk, cukup berurutan, maka menggunakan cache memori mungkin membantu pemeriksaan duplikasi rekaman.
Saya tahu ini adalah utas yang sangat lama tetapi hanya memetikan seseorang seperti saya membutuhkan solusi ini tetapi di VB.NET inilah yang saya gunakan berdasarkan jawaban di atas.
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
Saya mengalami beberapa masalah dengan ini - EntityKey saya terdiri dari tiga properti (PK dengan 3 kolom) dan saya tidak ingin memeriksa setiap kolom karena itu akan jelek. Saya memikirkan solusi yang bekerja sepanjang waktu dengan semua entitas.
Alasan lain untuk ini adalah saya tidak suka menangkap UpdateExceptions setiap saat.
Sedikit Refleksi diperlukan untuk mendapatkan nilai properti kunci.
Kode diimplementasikan sebagai ekstensi untuk menyederhanakan penggunaan sebagai:
context.EntityExists<MyEntityType>(item);
Silahkan lihat:
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;
}
Saya hanya memeriksa apakah objeknya nol, itu berfungsi 100% untuk saya
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";
}
Mengapa tidak melakukannya?
var result= ctx.table.Where(x => x.UserName == "Value").FirstOrDefault();
if(result?.field == value)
{
// Match!
}
Terlepas dari apa objek Anda dan untuk tabel apa dalam database, satu-satunya hal yang perlu Anda miliki adalah kunci utama dalam objek.
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