检查实体框架中是否存在对象的最佳方法?

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

166423 次浏览

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

如果不想直接执行 SQL,最好的方法是使用 任何()。这是因为 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

我在这方面遇到了一些麻烦——我的 EntityKey 由三个属性组成(PK 有3个列) ,我不想检查每个列,因为那样会很难看。 I thought about a solution that works all time with all entities.

另一个原因是我不喜欢每次都捕获 UpdateException。

需要一点反射来获取键属性的值。

该代码是作为一个扩展实现的,以简化使用:

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;
}

我知道这是一个非常老的线程,但只是以防有人喜欢我需要这个解决方案,但在 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

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

Note that the raw data was a CSV file that contained many individual records that had to be parsed. The records in each consecutive file (which came at a rate of about 1 every 5 minutes) overlapped considerably, hence the high percentage of duplicates.

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

I just check if object is null , it works 100% for me

    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!
}

最好的办法

不管您的对象是什么,也不管数据库中的表是什么,您唯一需要的是对象中的主键。

C # 代码

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

NET 代码

Dim dbValue = EntityObject.Entry(obj).GetDatabaseValues()
If dbValue Is Nothing Then
Don't exist
End If