Entity Framework - проверка записи загружаемого файла в базу данных - сохранена ли запись? [Дубликат]

Оба вышеуказанных ответа вернут только один индекс, если есть несколько строк, которые принимают максимальное значение. Если вам нужны все строки, функция не работает. Но это не сложно. Ниже приведен пример серии; то же самое можно сделать для DataFrame:

In [1]: from pandas import Series, DataFrame

In [2]: s=Series([2,4,4,3],index=['a','b','c','d'])

In [3]: s.idxmax()
Out[3]: 'b'

In [4]: s[s==s.max()]
Out[4]: 
b    4
c    4
dtype: int64
91
задан Alex Angas 4 January 2010 в 01:51
поделиться

7 ответов

Если вы не хотите напрямую выполнять 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
192
ответ дан Dan F 21 August 2018 в 08:59
поделиться
  • 1
    И в VB If (context.MyEntity.Any (o = & gt; o.Id & gt; idToMAtch)) Затем «Это совпадение! End If Извините, это не в кодовом теге, я не мог понять, как это сделать! – Kevin Morrissey 13 March 2013 в 19:56
  • 2
    Думаете, вы имеете в виду o.Id & gt; idToMatch НЕ равно совпадению – Colin 14 March 2013 в 16:20
  • 3
    что если я буду искать по имени, и я хочу получить идентификатор, если он существует? – Mihai Bratulescu 6 May 2014 в 08:39
  • 4
    Здравствуй. как мы можем проверить, существует ли он, и после этого выбрать все свои данные? – virtouso 7 April 2015 в 01:27
  • 5
    @virtouso Сделайте проверку .Any (), затем выполните запрос. Я не думаю, что есть вызов API для этого, но вы можете написать свой собственный метод помощника. – Alex Angas 8 April 2015 в 05:40
4
ответ дан Heretic Monkey 21 August 2018 в 08:59
поделиться

С точки зрения производительности, я думаю, что прямой запрос SQL с использованием команды EXISTS был бы уместным. См. Здесь, как выполнять SQL непосредственно в Entity Framework: http://blogs.microsoft.co.il/blogs/gilf/archive/2009/11/25/execute-t-sql-statements-inentity -framework-4.aspx

7
ответ дан Konamiman 21 August 2018 в 08:59
поделиться

Почему бы не сделать это?

var result= ctx.table.Where(x => x.UserName == "Value").FirstOrDefault();

if(result.field == value)
{
  // Match!
}
0
ответ дан Matheus Miranda 21 August 2018 в 08:59
поделиться

Мне пришлось управлять сценарием, в котором процент дубликатов, предоставленных в новых записях данных, был очень высоким, и было сделано так много тысяч вызовов базы данных для проверки дубликатов (так что ЦП отправил много времени на 100 %). В конце концов я решил сохранить последние 100 000 записей в кэше в памяти. Таким образом, я мог проверить наличие дубликатов в кэшированных записях, которые были чрезвычайно быстрыми по сравнению с запросом LINQ к базе данных SQL, а затем записывать любые действительно новые записи в базу данных (а также добавлять их в кеш данных, что также сортировать и обрезать, чтобы поддерживать его длину).

Обратите внимание, что необработанные данные были CSV-файлом, который содержал много отдельных записей, которые нужно было проанализировать. Записи в каждом последовательном файле (который приходил со скоростью примерно 1 раз в 5 минут) значительно перекрывались, следовательно, высокий процент дубликатов.

Короче говоря, если у вас есть timestamped необработанные данные, в порядке, то использование кеша памяти может помочь с проверкой дублирования записи.

3
ответ дан ProfNimrod 21 August 2018 в 08:59
поделиться
  • 1
    Много раз, когда разработчики придумывают ваш сценарий, возможно, с некоторыми завихрениями. Я хотел бы попросить вас перевести решение на C #, чтобы мы и многие будущие разработчики выиграли. +1. Я хотел бы, чтобы решение было расширено до сообщения в блоге! :) – sangam 23 February 2015 в 18:36

У меня были некоторые проблемы с этим - мой 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;
    }
3
ответ дан Sven 21 August 2018 в 08:59
поделиться

Я просто проверяю, является ли объект нулевым, он работает на 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";
    }
1
ответ дан user 21 August 2018 в 08:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: