답변:
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>()
.
성능 측면에서 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
새 데이터 레코드에서 제공되는 중복의 비율이 매우 높고 중복을 확인하기 위해 수천 건의 데이터베이스 호출이 발생하는 시나리오를 관리해야했습니다 (따라서 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를 잡는 것을 좋아하지 않기 때문입니다.
키 속성의 값을 얻으려면 약간의 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;
}
객체가 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