Answers:
如果您不想直接执行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
T
为,IEnumerable
并返回包含的对象,则Id
应该可以使用通用函数IsExists<T>()
。
我必须处理一个场景,在该场景中,新数据记录中提供的重复项百分比很高,并且要进行数千次数据库调用以检查重复项(因此CPU以100%的时间发送了大量时间)。最后,我决定将最后的100,000条记录保留在内存中。这样,我可以检查缓存记录的重复项,这与对SQL数据库的LINQ查询相比是非常快的,然后将任何真正新的记录写入数据库(以及将它们添加到数据缓存中,我也排序和修剪以使其长度易于管理)。
请注意,原始数据是CSV文件,其中包含许多必须解析的单个记录。每个连续文件中的记录(每5分钟大约有1个记录)重叠很多,因此重复项的百分比很高。
简而言之,如果您给原始数据打了时间戳,几乎是按顺序进行的,那么使用内存缓存可能有助于记录重复检查。
我知道这是一个非常老的线程,但是以防万一像我这样的人需要此解决方案,但是在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;
}
我只是检查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";
}
为什么不这样做呢?
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