Ответы:
Если вы не хотите выполнять 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
T
интерфейсом, который есть, IEnumerable
и возвращаете объекты, содержащие Id
, вы сможете использовать свою универсальную функцию IsExists<T>()
.
С точки зрения производительности я полагаю, что прямой 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
Мне пришлось управлять сценарием, в котором процент дубликатов, предоставляемых в новых записях данных, был очень высок, и для проверки дубликатов выполнялось очень много тысяч вызовов базы данных (так что ЦП отправлял много времени на 100%). В конце концов, я решил оставить последние 100 000 записей в кеш-памяти. Таким образом, я мог проверять наличие дубликатов кэшированных записей, что было чрезвычайно быстро по сравнению с запросом LINQ к базе данных SQL, а затем записывать любые действительно новые записи в базу данных (а также добавлять их в кеш данных, что я также отсортированы и обрезаны, чтобы длина оставалась управляемой).
Обратите внимание, что исходные данные были файлом CSV, содержащим множество отдельных записей, которые необходимо было проанализировать. Записи в каждом последующем файле (который поступает примерно 1 раз каждые 5 минут) значительно перекрываются, отсюда высокий процент дубликатов.
Короче говоря, если у вас есть входящие необработанные данные с метками времени, в основном в порядке, то использование кеша памяти может помочь при проверке дублирования записей.
Я знаю, что это очень старый поток, но просто на случай, если кому-то вроде меня понадобится это решение, но в 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
У меня были проблемы с этим - мой 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;
}
Я просто проверяю, является ли объект нулевым, у меня он работает на 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";
}
Почему бы не сделать это?
var result= ctx.table.Where(x => x.UserName == "Value").FirstOrDefault();
if(result?.field == value)
{
// Match!
}
Независимо от того, что это за объект и для какой таблицы в базе данных, единственное, что вам нужно, - это первичный ключ в объекте.
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