从性能角度来看,检查对象是否存在于数据库中的最佳方法是什么?我正在使用Entity Framework 1.0(ASP.NET 3.5 SP1)。
从性能角度来看,检查对象是否存在于数据库中的最佳方法是什么?我正在使用Entity Framework 1.0(ASP.NET 3.5 SP1)。
我知道这是一个非常老的帖子,但以防像我这样的人需要这个解决方案,但在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由三个属性组成(具有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;
}
我只是检查对象是否为空,这对我来说百分之百有效
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!
}
无论您的对象是什么,以及针对数据库中哪个表格,您唯一需要拥有的就是对象中的主键。
var dbValue = EntityObject.Entry(obj).GetDatabaseValues();
if (dbValue == null)
{
Don't exist
}
Dim dbValue = EntityObject.Entry(obj).GetDatabaseValues()
If dbValue Is Nothing Then
Don't exist
End If
protected bool IsExists(int id){ return T.Any(c => c.Id.Equals(id)); }
但是c.Id
给了我一个错误,因为它是一个泛型类。我想到的另一种方法是protected bool IsExists(int id){ return T.Find(id) != null ; }
。但我想使用前者。如何解决? - phougatvAny
似乎仍会从数据库中获取所有值。使用Find() != null
更轻量级。 - Neville NazeraneT
限制为一个包含Id
的对象并实现了IEnumerable
接口,那么你应该能够使用你的泛型函数IsExists<T>()
。 - Suncat2000