Yanıtlar:
SQL'i doğrudan yürütmek istemiyorsanız, en iyi yol Any () kullanmaktır . Bunun nedeni, Any () bir eşleşme bulur bulmaz dönecek olmasıdır. Başka bir seçenek de Count () ' dır , ancak bunun geri dönmeden önce her satırı kontrol etmesi gerekebilir.
İşte nasıl kullanılacağına dair bir örnek:
if (context.MyEntity.Any(o => o.Id == idToMatch))
{
// Match!
}
Ve vb.net'te
If context.MyEntity.Any(function(o) o.Id = idToMatch) Then
' Match!
End If
T
olan bir arabirime kısıtlarsanız ve bir IEnumerable
içeren nesneler döndürürseniz Id
, genel işlevinizi kullanabilmeniz gerekir IsExists<T>()
.
Performans açısından, EXISTS komutunu kullanan doğrudan bir SQL sorgusunun uygun olacağını tahmin ediyorum. SQL'i doğrudan Entity Framework'te nasıl çalıştıracağınıza bakın: http://blogs.microsoft.co.il/blogs/gilf/archive/2009/11/25/execute-t-sql-statements-in-entity-framework- 4.aspx
Yeni veri kayıtlarında sağlanan çoğaltmaların yüzdesinin çok yüksek olduğu ve yinelemeleri kontrol etmek için o kadar çok veri tabanı çağrısının yapıldığı bir senaryoyu yönetmem gerekiyordu (bu yüzden CPU çok fazla zaman gönderdi% 100). Sonunda son 100.000 kaydı hafızada tutmaya karar verdim. Bu şekilde, önbelleğe alınmış kayıtlara karşı yinelenen kayıtlar olup olmadığını kontrol edebildim, bu da SQL veritabanına yönelik bir LINQ sorgusuyla karşılaştırıldığında son derece hızlıydı ve ardından veritabanına gerçekten yeni kayıtlar yazabiliyordum (ayrıca bunları veri önbelleğine ekleyebildim. uzunluğunu yönetilebilir tutmak için sıralanmış ve kırpılmıştır).
Ham verilerin, ayrıştırılması gereken birçok ayrı kaydı içeren bir CSV dosyası olduğunu unutmayın. Her ardışık dosyadaki kayıtlar (her 5 dakikada bir yaklaşık 1 oranında gelir) önemli ölçüde örtüşüyordu, bu nedenle yineleme yüzdesi yüksek.
Kısacası, hemen hemen sırayla gelen zaman damgalı ham verileriniz varsa, bir bellek önbelleği kullanmak kayıt çoğaltma kontrolünde yardımcı olabilir.
Bunun çok eski bir iş parçacığı olduğunu biliyorum ama sadece benim gibi birinin bu çözüme ihtiyacı var ama VB.NET'te yukarıdaki cevaplara dayanarak kullandım.
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
Bununla ilgili biraz sorun yaşadım - EntityKey'im üç özellikten oluşuyor (3 sütunlu PK) ve her bir sütunu kontrol etmek istemedim çünkü bu çirkin olurdu. Her zaman tüm varlıklarla çalışan bir çözüm düşündüm.
Bunun bir başka nedeni de, her seferinde UpdateExceptions'ı yakalamaktan hoşlanmam.
Anahtar özelliklerin değerlerini elde etmek için biraz Yansıma gerekir.
Kod, aşağıdaki gibi kullanımı basitleştirmek için bir uzantı olarak uygulanır:
context.EntityExists<MyEntityType>(item);
Bir göz atın:
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;
}
Sadece nesnenin boş olup olmadığını kontrol ediyorum, benim için% 100 çalışıyor
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";
}
Neden yapmıyorsun?
var result= ctx.table.Where(x => x.UserName == "Value").FirstOrDefault();
if(result?.field == value)
{
// Match!
}
Nesneniz ne olursa olsun ve veritabanındaki hangi tablo için ihtiyacınız olan tek şey nesnedeki birincil anahtardır.
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