Подтвердить что ты не робот

Лучший способ проверить, существует ли объект в Entity Framework?

Каков наилучший способ проверить, существует ли объект в базе данных с точки зрения производительности? Я использую Entity Framework 1.0 (ASP.NET 3.5 SP1).

4b9b3361

Ответ 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

Ответ 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!
}