2009-06-26 2 views
8

GetObjectKey는 기존의 인스턴스화 된 개체를 검색하고 데이터 저장소를 검색하는 이점이 있습니다. 당신은 강한 타이핑의 일부를 잃게하고 결과 개체를 캐스팅 할 필요가 같이 그러나, 그것은 또한 같다 :LINQ 쿼리 또는 GetObjectKey를 사용하여 단일 Entity Framework 엔터티를 검색 하시겠습니까?

int customerID = 1; 
Customer customer = (from c in context.Customers 
        where c.CustomerID = customerID 
        select c).FirstOrDefault(); 

개인적으로

int customerID = 1; 
EntityKey key = new EntityKey("MyEntities.Customers", "CustomerID", customerID); 
Customer customer = context.GetObjectByKey(key) as Customer; 

LINQ 대

GetObjectKey을, 나는 후자를 선호 방법 때문에, 타이핑. 또한, 귀하의 DAL은 모든 Get 메서드가 쿼리 인 상당히 균일합니다 (개인적인 선호도 일지라도).

남녀 학생들은 무엇을 사용합니까?

+0

이전 방법에서는 캐스트 대신 "as"키워드를 사용했습니다. 그 결과, 결과가 null의 경우는 예외를 throw하지 않습니다. as 키워드는 값을 캐스팅하려고 시도하지만 올바른 유형이 아닌 경우 대신 null을 제공합니다. 그래서 당신은 context.GetObjectByKey (key) Customer를 가질 것입니다. –

+0

좋은 지적. 예제를 점수조차 조금만 수정하겠습니다. –

답변

9

내가 원하는 것은 무엇인지 명확하게 명시하기 때문에 후자를 선호합니다. EntityKey (ADO.NET 팀이 이해하지 못하는 것)를 사용하면 Entity Framework에서 부과 된 구조를 해결해야합니다. 두 번째 예제에서 사용한 것과 같은 방식으로 쿼리 언어를 사용함으로써 우리는 나머지 개발자 모두에게 코드를 살펴볼 것입니다.이 ID로이 객체를 원하거나 null을 원합니다.

저는 (당신이 첫 번째 예에서도 그렇듯이) 당신의 동료들에게 명확하지 않다는 핑계라고 생각하지 않습니다. :)

1

제 솔루션에서는 제네릭 프로그래밍을 사용합니다. 기본 리포지토리 클래스에서 나는 다음과 같은 코드를 가지고 있습니다 :

private string GetEnittySetName(string entityTypeName) 
{ 
    var container = context.MetadataWorkspace.GetEntityContainer(context.DefaultContainerName, DataSpace.CSpace); 
    string entitySetName = (from meta in container.BaseEntitySets 
          where meta.ElementType.Name == entityTypeName 
          select meta.Name).FirstOrDefault(); 
    return entitySetName; 
} 

private string entitySetName; 

protected string EntitySetName 
{ 
    get 
    { 
     if (string.IsNullOrEmpty(entitySetName)) 
     { 
      entitySetName = GetEnittySetName(typeof(T).Name); 
     } 
     return entitySetName; 
    } 
} 

public T SelectOne(Func<T, bool> exp) 
{ 
    return context.CreateQuery<T>(EntitySetName).Where(exp).FirstOrDefault(); 
} 
관련 문제