Frage

Was ist der beste Weg, um zu überprüfen, ob ein Objekt in der Datenbank von einer Performance-Sicht existiert? Ich bin mit Entity Framework 1.0 (ASP.NET 3.5 SP1).

War es hilfreich?

Lösung

Wenn Sie SQL nicht direkt ausgeführt werden soll, ist der beste Weg Any () . Dies liegt daran, Any () zurückkehren wird, sobald es eine Übereinstimmung findet. Eine weitere Option ist Count () , aber dies könnte müssen jede Zeile überprüfen vor der Rückkehr.

Hier ist ein Beispiel dafür, wie es zu benutzen:

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

Andere Tipps

Aus Performance-Sicht, ich denke, dass eine direkte SQL-Abfrage der VORHANDEN Befehl angemessen wäre. Sehen Sie hier, wie SQL direkt in Entity Framework auszuführen: http://blogs.microsoft.co.il/blogs/gilf/archive/2009/11/25/execute-t-sql-statements-in-entity -Framework-4.aspx

Ich hatte ein Szenario zu verwalten, wo der Anteil der Duplikate in den neuen Datensätzen vorgesehen ist, war sehr hoch, und so viele tausend Datenbank Anrufe gemacht wurden Dubletten zu prüfen (so die CPU viel Zeit bei 100 gesendet %). Am Ende habe ich beschlossen, die letzten 100.000 Datensätze im Arbeitsspeicher zwischengespeichert zu halten. So kann ich für Duplikate gegen die im Cache gespeicherten Datensätze überprüfen könnte, die extrem schnell war, als auf eine LINQ-Abfrage für die SQL-Datenbank verglichen, und schreiben Sie dann keine wirklich neue Datensätze in der Datenbank (wie auch sie zu den Daten-Cache hinzufügen, die ich auch sortiert und getrimmt seine Länge überschaubar) zu halten.

Beachten Sie, dass die Rohdaten eine CSV-Datei war, die viele einzelne Datensätze enthalten, die analysiert werden mussten. Die Datensätze in jeder aufeinanderfolgenden Datei (die mit einer Rate von etwa 1 alle 5 Minuten kam) überlappt wesentlich, damit den hohen Anteil an Duplikaten.

Kurz gesagt, wenn Sie Rohdaten timestamped haben kommen in, so ziemlich in Ordnung, dann einen Speicher-Cache kann mit der Aufzeichnung Dublettencheck helfen.

Ich weiß, dass dies ein sehr alter Thread ist aber nur für den Fall jemand wie ich diese Lösung muss aber in VB.NET bin hier, was ich Basis oben auf den Antworten verwendet.

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

hatte ich einige Probleme mit diesem - mein EntityKey besteht aus drei Eigenschaften (PK mit 3 Spalten) und ich wollte nicht jeden der Spalt überprüfen, weil das hässlich wäre. Ich dachte an eine Lösung, die alle Zeit mit allen Unternehmen arbeitet.

Ein weiterer Grund dafür ist, Ich mag es nicht UpdateExceptions jedes Mal zu fangen.

Ein wenig Reflexion benötigt wird, um die Werte der Schlüsseleigenschaften zu erhalten.

Der Code wird als Erweiterung implementiert, um die Nutzung zu vereinfachen:

context.EntityExists<MyEntityType>(item);

Haben Sie einen Blick:

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 nur überprüfen, wenn das Objekt null ist, es funktioniert 100% für mich

    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 es nicht?

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

if(result?.field == value)
{
  // Match!
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top