121

从性能的角度来看,检查数据库中是否存在对象的最佳方法是什么?我正在使用实体框架 1.0 (ASP.NET 3.5 SP1)。

4

8 回答 8

248

如果不想直接执行 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
于 2010-01-04T01:04:53.907 回答
9

从性能的角度来看,我想使用EXISTS命令的直接 SQL 查询是合适的。请参阅此处了解如何在实体框架中直接执行 SQL:http: //blogs.microsoft.co.il/blogs/gilf/archive/2009/11/25/execute-t-sql-statements-in-entity-framework- 4.aspx

于 2009-11-26T08:48:24.017 回答
5

我必须管理一个场景,其中在新数据记录中提供的重复百分比非常高,并且为了检查重复而进行了数千次数据库调用(因此 CPU 以 100% 的速度发送了很多时间)。最后,我决定将最后 100,000 条记录缓存在内存中。通过这种方式,我可以检查缓存记录的重复项,这与针对 SQL 数据库的 LINQ 查询相比非常快,然后将任何真正的新记录写入数据库(以及将它们添加到数据缓存中,我也这样做了)排序和修剪以保持其长度易于管理)。

请注意,原始数据是一个 CSV 文件,其中包含许多必须解析的单独记录。每个连续文件中的记录(以每 5 分钟约 1 条的速度出现)重叠很大,因此重复率很高。

简而言之,如果您输入了带有时间戳的原始数据,并且非常有序,那么使用内存缓存可能有助于记录重复检查。

于 2014-06-02T15:10:35.730 回答
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
于 2012-10-23T00:18:50.617 回答
2

我遇到了一些麻烦 - 我的 EntityKey 包含三个属性(带有 3 列的 PK),我不想检查每一列,因为那会很难看。我想到了一个始终适用于所有实体的解决方案。

另一个原因是我不喜欢每次都捕获 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;
    }
于 2011-01-14T09:30:03.823 回答
2

我只是检查 object 是否为 null ,它对我来说 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";
    }
于 2016-05-14T05:40:37.007 回答
0

为什么不这样做?

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

if(result?.field == value)
{
  // Match!
}
于 2017-03-08T22:53:20.863 回答
0

最好的方法

无论您的对象是什么以及数据库中的哪个表,您唯一需要的就是对象中的主键。

C# 代码

var dbValue = EntityObject.Entry(obj).GetDatabaseValues();
if (dbValue == null)
{
   Don't exist
}

VB.NET 代码

Dim dbValue = EntityObject.Entry(obj).GetDatabaseValues()
If dbValue Is Nothing Then
   Don't exist
End If
于 2019-12-26T04:55:31.447 回答