Respostas:
Se você não deseja executar SQL diretamente, a melhor maneira é usar Any () . Isso ocorre porque Any () retornará assim que encontrar uma correspondência. Outra opção é Count () , mas pode ser necessário verificar todas as linhas antes de retornar.
Aqui está um exemplo de como usá-lo:
if (context.MyEntity.Any(o => o.Id == idToMatch))
{
// Match!
}
E em vb.net
If context.MyEntity.Any(function(o) o.Id = idToMatch) Then
' Match!
End If
T
a uma interface que é IEnumerable
e retornar objetos que contêm um Id
, você deve ser capaz de usar sua função genérica IsExists<T>()
.
Do ponto de vista do desempenho, acho que uma consulta SQL direta usando o comando EXISTS seria apropriada. Veja aqui como executar SQL diretamente no Entity Framework: http://blogs.microsoft.co.il/blogs/gilf/archive/2009/11/25/execute-t-sql-statements-in-entity-framework- 4.aspx
Tive que gerenciar um cenário em que a porcentagem de duplicatas fornecidas nos novos registros de dados era muito alta, e tantos milhares de chamadas de banco de dados estavam sendo feitas para verificar a existência de duplicatas (portanto, a CPU enviava muito tempo a 100%). No final, decidi manter os últimos 100.000 registros em cache na memória. Dessa forma, eu poderia verificar se há duplicatas nos registros armazenados em cache, o que era extremamente rápido quando comparado a uma consulta LINQ no banco de dados SQL e, em seguida, gravar quaisquer registros genuinamente novos no banco de dados (bem como adicioná-los ao cache de dados, o que também classificados e aparados para manter seu comprimento gerenciável).
Observe que os dados brutos eram um arquivo CSV que continha muitos registros individuais que precisavam ser analisados. Os registros em cada arquivo consecutivo (que chegavam a uma taxa de cerca de 1 a cada 5 minutos) se sobrepunham consideravelmente, daí a alta porcentagem de duplicatas.
Em suma, se você tiver dados brutos com carimbo de data / hora chegando, praticamente em ordem, usar um cache de memória pode ajudar na verificação de duplicação de registros.
Eu sei que este é um tópico muito antigo, mas apenas no caso de alguém como eu precisa desta solução, mas em VB.NET aqui está o que usei com base nas respostas acima.
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
Eu tive alguns problemas com isso - minha EntityKey consiste em três propriedades (PK com 3 colunas) e eu não queria verificar cada uma das colunas porque isso seria feio. Pensei em uma solução que funcionasse o tempo todo com todas as entidades.
Outra razão para isso é que eu não gosto de capturar UpdateExceptions todas as vezes.
Um pouco de reflexão é necessário para obter os valores das propriedades-chave.
O código é implementado como uma extensão para simplificar o uso como:
context.EntityExists<MyEntityType>(item);
Dar uma olhada:
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;
}
Acabei de verificar se o objeto é nulo, funciona 100% para mim
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";
}
Por que não fazer?
var result= ctx.table.Where(x => x.UserName == "Value").FirstOrDefault();
if(result?.field == value)
{
// Match!
}
Independentemente de qual seja o seu objeto e de qual tabela no banco de dados, a única coisa que você precisa é a chave primária no objeto.
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