Entity Framework에 개체가 있는지 확인하는 가장 좋은 방법은 무엇입니까?
성능 관점에서 데이터베이스에 개체가 있는지 확인하는 가장 좋은 방법은 무엇입니까? Entity Framework 1.0 (ASP.NET 3.5 SP1)을 사용하고 있습니다.
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
성능 측면에서 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!
}
참고 URL : https://stackoverflow.com/questions/1802286/best-way-to-check-if-object-exists-in-entity-framework
'programing tip' 카테고리의 다른 글
마우스 오버시 이름에서 밑줄을 제거하는 방법 (0) | 2020.08.07 |
---|---|
각도기를 사용하여 요소가 보이는지 확인하는 방법은 무엇입니까? (0) | 2020.08.07 |
C에서 롤링 중간 알고리즘 (0) | 2020.08.06 |
속기 배경 속성의 배경 크기 (CSS3) (0) | 2020.08.06 |
Visual Studio에서 Interop 유형 포함 참과 거짓의 차이점은 무엇입니까? (0) | 2020.08.06 |