문제

성능 관점에서 데이터베이스에 객체가 존재하는지 확인하는 가장 좋은 방법은 무엇입니까?저는 Entity Framework 1.0(ASP.NET 3.5 SP1)을 사용하고 있습니다.

도움이 되었습니까?

해결책

SQL을 직접 실행하고 싶지 않다면 가장 좋은 방법은 사용하는 것입니다. 어느(). 이는 일치를 찾는 즉시 ()가 돌아 오기 때문입니다. 또 다른 옵션입니다 세다(), 그러나 반환하기 전에 모든 행을 확인해야 할 수도 있습니다.

다음은 사용 방법의 예입니다.

if (context.MyEntity.Any(o => o.Id == idToMatch))
{
    // Match!
}

그리고 vb.net에서

If context.MyEntity.Any(function(o) o.Id = idToMatch) Then
    ' Match!
End If

다른 팁

성능 관점에서 존재합니다 명령이 적절할 것입니다. 엔티티 프레임 워크에서 SQL을 직접 실행하는 방법은 여기를 참조하십시오. http://blogs.microsoft.co.il/blogs/gilf/archive/2009/11/25/execute-t-cl-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

나는 이것에 약간의 문제가있었습니다 - 내 엔티키는 3 개의 속성 (3 개의 열이있는 pk)으로 구성되어 있으며 각 열을 추악하기 때문에 각 열을 확인하고 싶지 않았습니다. 나는 모든 엔티티와 항상 작동하는 솔루션에 대해 생각했습니다.

이것의 또 다른 이유는 매번 업데이트 외환을 포착하는 것을 좋아하지 않기 때문입니다.

주요 속성의 값을 얻으려면 약간의 반사가 필요합니다.

코드는 사용법을 단순화하기 위해 확장으로 구현됩니다.

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!
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top