Wie kann ich am besten überprüfen, ob ein Objekt in der Datenbank aus Performance-Sicht vorhanden ist? Ich verwende Entity Framework 1.0 (ASP.NET 3.5 SP1).
Wenn Sie SQL nicht direkt ausführen möchten, verwenden Sie Any () . Dies liegt daran, dass Any () zurückkehrt, sobald es eine Übereinstimmung findet. Eine andere Option ist Count () , dies muss jedoch vor dem Zurückkehren möglicherweise jede Zeile überprüfen.
Hier ist ein Beispiel, wie man es benutzt:
if (context.MyEntity.Any(o => o.Id == idToMatch))
{
// Match!
}
Und in vb.net
If context.MyEntity.Any(function(o) o.Id = idToMatch) Then
' Match!
End If
Aus Sicht der Performance denke ich, dass eine direkte SQL-Abfrage mit dem Befehl EXISTS sinnvoll wäre. Informationen zum direkten Ausführen von SQL in Entity Framework finden Sie hier: http://blogs.Microsoft.co.il/blogs/gilf/archive/2009/11/25/execute-t-sql-statements-in-entity- Rahmen-4.aspx
Ich musste ein Szenario verwalten, in dem der Prozentsatz der in den neuen Datensätzen bereitgestellten Duplikate sehr hoch war und so viele tausend Datenbankaufrufe durchgeführt wurden, um nach Duplikaten zu suchen (so dass die CPU sehr viel Zeit bei 100% hatte). Am Ende entschied ich mich, die letzten 100.000 Datensätze im Speicher zu speichern. Auf diese Weise konnte ich die zwischengespeicherten Datensätze auf Duplikate überprüfen, was im Vergleich zu einer LINQ-Abfrage mit der SQL-Datenbank extrem schnell war, und dann alle wirklich neuen Datensätze in die Datenbank schreiben (sowie sie zum Datencache hinzufügen, was ich auch tat.) sortiert und getrimmt, um die Länge überschaubar zu halten).
Beachten Sie, dass die Rohdaten eine CSV-Datei waren, die viele einzelne Datensätze enthielt, die analysiert werden mussten. Die Datensätze in jeder aufeinanderfolgenden Datei (die alle 5 Minuten etwa 1 war) überschnitten sich beträchtlich, daher der hohe Prozentsatz der Duplikate.
Kurz gesagt: Wenn Sie Rohdaten zeitlich mit einem Zeitstempel versehen haben, ziemlich in der richtigen Reihenfolge, kann die Verwendung eines Speichercaches bei der Überprüfung der Datensatzduplikate hilfreich sein.
Ich weiß, dass dies ein sehr alter Thread ist, aber nur, wenn jemand wie ich diese Lösung braucht, aber in VB.NET habe ich die Antworten verwendet, die ich auf den obigen Antworten verwendet habe.
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
Ich hatte einige Probleme damit - mein EntityKey besteht aus drei Eigenschaften (PK mit 3 Spalten), und ich wollte nicht jede der Spalten überprüfen, da dies hässlich wäre ... __ alle Entitäten.
Ein weiterer Grund dafür ist, dass ich UpdateExceptions nicht jedes Mal erwische.
Ein wenig Reflexion ist erforderlich, um die Werte der Schlüsseleigenschaften abzurufen.
Der Code ist als Erweiterung implementiert, um die Verwendung zu vereinfachen als:
context.EntityExists<MyEntityType>(item);
Guck mal:
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;
}
Ich überprüfe nur, ob das Objekt null ist, es funktioniert für mich 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";
}
Warum machst du es nicht?
var result= ctx.table.Where(x => x.UserName == "Value").FirstOrDefault();
if(result?.field == value)
{
// Match!
}