Оба вышеуказанных ответа вернут только один индекс, если есть несколько строк, которые принимают максимальное значение. Если вам нужны все строки, функция не работает. Но это не сложно. Ниже приведен пример серии; то же самое можно сделать для 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
Если вы не хотите напрямую выполнять 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
С точки зрения производительности, я думаю, что прямой запрос SQL с использованием команды EXISTS был бы уместным. См. Здесь, как выполнять SQL непосредственно в Entity Framework: http://blogs.microsoft.co.il/blogs/gilf/archive/2009/11/25/execute-t-sql-statements-inentity -framework-4.aspx
Почему бы не сделать это?
var result= ctx.table.Where(x => x.UserName == "Value").FirstOrDefault();
if(result.field == value)
{
// Match!
}
Мне пришлось управлять сценарием, в котором процент дубликатов, предоставленных в новых записях данных, был очень высоким, и было сделано так много тысяч вызовов базы данных для проверки дубликатов (так что ЦП отправил много времени на 100 %). В конце концов я решил сохранить последние 100 000 записей в кэше в памяти. Таким образом, я мог проверить наличие дубликатов в кэшированных записях, которые были чрезвычайно быстрыми по сравнению с запросом LINQ к базе данных SQL, а затем записывать любые действительно новые записи в базу данных (а также добавлять их в кеш данных, что также сортировать и обрезать, чтобы поддерживать его длину).
Обратите внимание, что необработанные данные были CSV-файлом, который содержал много отдельных записей, которые нужно было проанализировать. Записи в каждом последовательном файле (который приходил со скоростью примерно 1 раз в 5 минут) значительно перекрывались, следовательно, высокий процент дубликатов.
Короче говоря, если у вас есть timestamped необработанные данные, в порядке, то использование кеша памяти может помочь с проверкой дублирования записи.
У меня были некоторые проблемы с этим - мой 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";
}