最好的方法来检查entity framework中是否存在对象?

从性能的angular度来看,检查数据库中是否存在对象的最好方法是什么? 我正在使用entity framework1.0(ASP.NET 3.5 SP1)。

如果你不想直接执行SQL,最好的方法是使用Any() 。 这是因为Any()只要find一个匹配就会返回。 另一个选项是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 

从性能angular度来看,我猜想使用EXISTS命令的直接SQL查询将是适当的。 在这里看到如何直接在entity framework中执行SQL: http : //blogs.microsoft.co.il/blogs/gilf/archive/2009/11/25/execute-t-sql-statements-in-entity-framework- 4.aspx

我知道这是一个非常古老的线程,但只是像我这样的人需要这个解决scheme,但在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 

我遇到了一些麻烦 – 我的EntityKey由三个属性组成(PK有三列),我不想检查每一列,因为那样会很难看。 我想到了一个与所有实体一起工作的解决scheme。

另一个原因是我不喜欢每次都捕获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; } 

我必须pipe理一个场景,在新的数据logging中提供的重复数据的比例非常高,并且有数以千计的数据库调用正在检查重复项(所以CPU以100%的时间发送大量的时间)。 最后,我决定将最后的100,000条logging保存在内存中。 通过这种方式,我可以检查cachinglogging的重复数据,与对SQL数据库的LINQ查询相比,速度非常快,然后将任何真正的新logging写入数据库(以及将它们添加到数据caching中,我也sorting和修剪,以保持其长度pipe理)。

请注意,原始数据是一个CSV文件,其中包含许多必须parsing的单个logging。 每个连续文件中的logging(每5分钟大约1个logging)重叠很多,因此重复的百分比很高。

简而言之,如果您有时间戳原始数据,那么使用内存caching可能有助于logging重复检查。

我只是检查对象是否为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"; } 

为什么不做呢?

 var result= ctx.table.Where(x => x.UserName == "Value").FirstOrDefault(); if(result.field == value) { // Match! }