wake-up-neo.com

Bester Weg, um zu prüfen, ob ein Objekt in Entity Framework vorhanden ist?

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).

95
Freddy

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
196
Alex Angas

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

7
Konamiman

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.

4
ProfNimrod

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
4
Kevin Morrissey

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;
    }
4
Sven

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";
    }
2
user4584103

Warum machst du es nicht?

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

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