2011-01-07 3 views
0

일반 저장소와 상호 작용할 일반 클래스를 구현하려고하는데 저장소를 벗어나는 개체를 처리해야 할 때를 제외하고는 모두 괜찮습니다.일반 클래스를 사용할 때 PK를 통해 EF를 쿼리하는 방법은 무엇입니까?

int을받는 가상 클래스가 있는데 그 기본 키로 개체를 가져 오는 리포지토리에 대한 쿼리를 구성하기 위해 int을 사용하고 싶습니다. 나는 EF에서 EntityKey 속성으로 작업 할 필요가 있지만 너무 잘 모르겠다는 느낌이 든다.

어쨌든

가 여기에 누군가가 내가 원하는 작업을 수행하는 방법에 대한 제안이 희망, 내가 코드에서 할 노력하고있어 무엇 :

public virtual T Get(int PrimaryKey) { 
    this.Repository.Select(
     t => 
      (t.PRIMARYKEY == PrimaryKey)).Single(); 
} 

가 좀 더 전문화 된 클래스와이 클래스를 확장 할을하지만, 대부분은 PK를 쿼리하여 개체를 얻으므로 이후로 기본 방법을 사용할 수있게되었습니다.

미리 제안 해 주셔서 감사합니다.

내가 반사와 함께 왔 곳 UPDATE는

그래서, 여기에, 그리고 나는 그것의 적절한 방법을 의심하지만, 어느 정도 내가 엔티티에 메시지 LINQ와 NotSupportedException 받고 있어요 ... 작동 메서드 'System.Object GetValue (System.Object, System.Object [])'메서드를 인식하지 못하고이 메서드를 저장소 식으로 변환 할 수 없습니다.. 나는이 말씀을 이해하고 왜 말하는 있지만, 나는 내 코드는 다음과 같습니다 때 그것을 극복하는 방법을 잘 모르겠어요 :

private readonly string TEntityName = typeof(T).Name; 

public virtual T Get(
    int PrimaryKey) { 
    return this.Repository.Select(
     t => 
      (((int)t.GetType().GetProperties().Single(
       p => 
        (p.Name == (this.TEntityName + "Id"))).GetValue(t, null)) == PrimaryKey)).Single(); 
} 

아는 사람이 나를 달리 반사를 사용하는 방법을 것을 기대, 저를 가리킬 수 있습니다 올바른 방향으로 감사!

답변

1

이런 식/조건을 필요로 동적으로이 술어를 생성 할 수 있도록 (반사 또는 식 트리 창조의 줄임말) 더 쉬운 방법이 없습니다

Expression<Func<Order,bool>> predicate = x => x.OrderId == 1; 
return ctx.Orders.Single(predicate); 

.

은 당신이 할 수있는 것은 매개 변수로 조건을 받아 들일 수 있습니다 :

또한
public virtual T Get(Expression<Func<T,bool>> predicate) { 
    this.Repository.Select(predicate).Single(); 
} 

당신이 T에 대한 몇 가지 일반적인 제약을 넣어 있는지 확인하십시오 (중 클래스/메소드 레벨에서).

+0

안녕하세요 @ RPM1984, 다시 만나서 반가워요! 나는 표현식을 전달할 생각도하고 있었지만 그 요구 사항을 다소 제거하고 싶었습니다. 예를 들어, 내 응용 프로그램은'Supervisor' ->'Provider' ->'Repository'처럼 계층화되어 있습니다. 제가 일반화하려고하는 '제공자'입니다. 표현식 (easies 솔루션 임에도 불구하고)을 사용하여'Supervisor' 레이어에서 만들고 Repository로 전달해야합니다. 결국에는 시도하고 피하고 싶은 많은 반복이있을 것입니다. 나는 반사가 올지도 모른다고 생각했지만, 무엇을 반사시켜야할지 모르겠다. – Gup3rSuR4c

+0

불행히도 반사와 표현의 나무는 나의 장점이 아니며 둘 다 필요하다. 가지고있는 것은 유형 (T)과 값 유형 (int)이며이를위한 술어를 작성해야합니다. 어쩌면 엔티티에 속성을 추가 한 경우 (예 :g' [PrimaryKey]'), 그 이상을 반영하여 표현 트리를 만듭니다. – RPM1984

+0

그래, 그게 내가 뭘 해봤는지 (내 질문에 업데이트),하지만 그 싸움없이 포기하지 ... 이후, 이것은 반영으로 가고있어, 내가 그것에 대해 더 구체적인 질문을 할게. 도와 주셔서 감사합니다! – Gup3rSuR4c

관련 문제