Відповіді:
Якщо ви не хочете безпосередньо виконувати 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 складається з трьох властивостей (ПК із 3 стовпцями), і я не хотів перевіряти кожен стовпчик, оскільки це було б некрасиво. Я подумав про рішення, яке весь час працює з усіма сутностями.
Ще одна причина цього - я не люблю ловити UpdateExceptions кожен раз.
Для отримання значень основних властивостей потрібно трохи рефлексії.
Код реалізований як розширення для спрощення використання як:
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