Antworten:
Wenn Sie SQL nicht direkt ausführen möchten, verwenden Sie am besten Any () . Dies liegt daran, dass Any () zurückkehrt, sobald eine Übereinstimmung gefunden wird. Eine andere Option ist Count () , dies muss jedoch möglicherweise jede Zeile überprüfen, bevor Sie zurückkehren.
Hier ist ein Beispiel für die Verwendung:
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
T
auf eine Schnittstelle beschränken IEnumerable
und Objekte zurückgeben, die eine enthalten Id
, sollten Sie in der Lage sein, Ihre generische Funktion zu verwenden IsExists<T>()
.
Aus Sicht der Leistung denke ich, dass eine direkte SQL-Abfrage mit dem Befehl EXISTS angemessen wäre. Hier erfahren Sie, wie Sie SQL direkt in Entity Framework ausführen können: http://blogs.microsoft.co.il/blogs/gilf/archive/2009/11/25/execute-t-sql-statements-in-entity-framework- 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 (die CPU hat also viel Zeit mit 100% gesendet). Am Ende habe ich beschlossen, die letzten 100.000 Datensätze im Speicher zu speichern. Auf diese Weise konnte ich nach Duplikaten für die zwischengespeicherten Datensätze suchen, was im Vergleich zu einer LINQ-Abfrage für die SQL-Datenbank extrem schnell war, und dann alle wirklich neuen Datensätze in die Datenbank schreiben (sowie sie dem Datencache hinzufügen, den ich auch habe sortiert und zugeschnitten, 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 betrug) überlappten sich erheblich, daher der hohe Prozentsatz an Duplikaten.
Kurz gesagt, wenn Sie Rohdaten mit Zeitstempel eingegeben haben, kann die Verwendung eines Speichercaches bei der Überprüfung der Datensatzduplizierung hilfreich sein.
Ich weiß, dass dies ein sehr alter Thread ist, aber nur für den Fall, dass jemand wie ich diese Lösung benötigt, aber in VB.NET habe ich Folgendes verwendet, basierend auf den obigen Antworten.
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. Ich dachte an eine Lösung, die jederzeit mit allen Entitäten funktioniert.
Ein weiterer Grund dafür ist, dass ich nicht jedes Mal UpdateExceptions abfangen möchte.
Ein wenig Reflexion ist erforderlich, um die Werte der Schlüsseleigenschaften zu erhalten.
Der Code wird als Erweiterung implementiert, um die Verwendung zu vereinfachen:
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 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 nicht?
var result= ctx.table.Where(x => x.UserName == "Value").FirstOrDefault();
if(result?.field == value)
{
// Match!
}
Unabhängig davon, was Ihr Objekt ist und für welche Tabelle in der Datenbank Sie nur den Primärschlüssel im Objekt benötigen.
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