Risposte:
Se non vuoi eseguire SQL direttamente, il modo migliore è usare Any () . Questo perché Any () tornerà non appena trova una corrispondenza. Un'altra opzione è Count () , ma potrebbe essere necessario controllare ogni riga prima di tornare.
Ecco un esempio di come usarlo:
if (context.MyEntity.Any(o => o.Id == idToMatch))
{
// Match!
}
E in vb.net
If context.MyEntity.Any(function(o) o.Id = idToMatch) Then
' Match!
End If
T
a un'interfaccia che è IEnumerable
e restituisci oggetti che contengono un Id
, dovresti essere in grado di usare la tua funzione generica IsExists<T>()
.
Dal punto di vista delle prestazioni, immagino che una query SQL diretta utilizzando il comando EXISTS sarebbe appropriata. Vedi qui per come eseguire SQL direttamente in Entity Framework: http://blogs.microsoft.co.il/blogs/gilf/archive/2009/11/25/execute-t-sql-statements-in-entity-framework- 4.aspx
Ho dovuto gestire uno scenario in cui la percentuale di duplicati forniti nei nuovi record di dati era molto alta e venivano effettuate così tante migliaia di chiamate al database per verificare la presenza di duplicati (quindi la CPU inviava molto tempo al 100%). Alla fine ho deciso di mantenere gli ultimi 100.000 record memorizzati nella cache. In questo modo ho potuto verificare la presenza di duplicati rispetto ai record memorizzati nella cache che era estremamente veloce rispetto a una query LINQ sul database SQL, quindi scrivere tutti i record veramente nuovi nel database (oltre ad aggiungerli alla cache dei dati, che ho anche ordinati e rifilati per mantenerne la lunghezza gestibile).
Tieni presente che i dati grezzi erano un file CSV che conteneva molti record individuali che dovevano essere analizzati. I record in ogni file consecutivo (che arrivava a una velocità di circa 1 ogni 5 minuti) si sovrapponevano notevolmente, da qui l'alta percentuale di duplicati.
In breve, se hai dati grezzi con timestamp in arrivo, praticamente in ordine, l'utilizzo di una cache di memoria potrebbe aiutare con il controllo della duplicazione dei record.
So che questo è un thread molto vecchio ma solo nel caso in cui qualcuno come me abbia bisogno di questa soluzione, ma in VB.NET ecco cosa ho usato in base alle risposte sopra.
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
Ho avuto qualche problema con questo: la mia EntityKey è composta da tre proprietà (PK con 3 colonne) e non volevo controllare ciascuna delle colonne perché sarebbe brutto. Ho pensato a una soluzione che funzioni sempre con tutte le entità.
Un altro motivo è che non mi piace catturare UpdateExceptions ogni volta.
È necessario un po 'di riflessione per ottenere i valori delle proprietà chiave.
Il codice è implementato come estensione per semplificarne l'utilizzo come:
context.EntityExists<MyEntityType>(item);
Dare un'occhiata:
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;
}
Controllo solo se l'oggetto è nullo, funziona al 100% per me
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";
}
Perché non farlo?
var result= ctx.table.Where(x => x.UserName == "Value").FirstOrDefault();
if(result?.field == value)
{
// Match!
}
Indipendentemente da quale sia il tuo oggetto e per quale tabella nel database, l'unica cosa che devi avere è la chiave primaria nell'oggetto.
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