Каков наилучший способ проверить, существует ли объект в базе данных с точки зрения производительности? Я использую Entity Framework 1.0 (ASP.NET 3.5 SP1).
Лучший способ проверить, существует ли объект в Entity Framework?
Ответ 1
Если вы не хотите напрямую выполнять SQL, лучший способ - использовать Any(). Это происходит потому, что Any() вернется, как только найдет совпадение. Другим вариантом является Count(), но это может потребоваться проверить каждую строку перед возвратом.
Вот пример того, как его использовать:
if (context.MyEntity.Any(o => o.Id == idToMatch))
{
// Match!
}
И в vb.net
If context.MyEntity.Any(function(o) o.Id = idToMatch) Then
' Match!
End If
Ответ 2
С точки зрения производительности я предполагаю, что прямой запрос SQL с помощью команды EXISTS будет уместным. См. Здесь, как выполнять SQL непосредственно в Entity Framework: http://blogs.microsoft.co.il/blogs/gilf/archive/2009/11/25/execute-t-sql-statements-in-entity-framework-4.aspx
Ответ 3
Я знаю, что это очень старый поток, но просто для того, чтобы кто-то вроде меня нуждался в этом решении, но в VB.NET, здесь я использовал базу для ответов выше.
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
У меня были некоторые проблемы с этим - мой EntityKey состоит из трех свойств (PK с 3 столбцами), и я не хотел проверять каждый из столбцов, потому что это было бы уродливо. Я думал о решении, которое работает все время со всеми сущностями.
Другая причина для этого - я не люблю каждый раз заражать UpdateExceptions.
Для получения значений свойств ключа требуется немного Reflection.
Код реализован как расширение, упрощающее использование:
context.EntityExists<MyEntityType>(item);
Посмотрите:
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;
}
Ответ 5
Мне пришлось управлять сценарием, в котором процент дубликатов, который был предоставлен в новых записях данных, был очень высоким, и было сделано так много тысяч вызовов базы данных для проверки дубликатов (поэтому ЦП отправил много времени на 100 %). В конце концов я решил сохранить последние 100 000 записей в кэше в памяти. Таким образом, я мог проверить наличие дубликатов в кэшированных записях, которые были чрезвычайно быстрыми по сравнению с запросом LINQ с базой данных SQL, а затем записывать в базу данных любые действительно новые записи (а также добавлять их в кеш данных, что также сортируется и обрезается, чтобы поддерживать ее длину).
Обратите внимание, что необработанные данные были CSV файлом, который содержал много отдельных записей, которые нужно было проанализировать. Записи в каждом последовательном файле (который приходил со скоростью примерно 1 раз в 5 минут) значительно перекрывались, следовательно, высокий процент дубликатов.
Короче говоря, если у вас есть timestamped необработанные данные, в значительной степени упорядоченные, то использование кеша памяти может помочь с проверкой дублирования записей.
Ответ 6
Я просто проверяю, является ли объект нулевым, он работает на 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";
}
Ответ 7
Почему бы не сделать это?
var result= ctx.table.Where(x => x.UserName == "Value").FirstOrDefault();
if(result.field == value)
{
// Match!
}