DBContext를 사용하여 EF와 인터페이스 할 수있는 일반 저장소를 작성 중입니다. DBContext 포함 항목 포함 - 기본 키가있는 람다
나는 엔티티를 기본 키 값을 받아 반환하는 일반적인 가져 오기() 메소드가 있습니다public class DALRepository<DALEntity> : IDisposable, IGenericRepository<DALEntity> where DALEntity : class
{
private IDbSet<DALEntity> dbSet;
private NWEntities context;
public DALRepository()
{
context = new NWEntities();
context.Configuration.LazyLoadingEnabled = false;
dbSet = context.Set<DALEntity>();
}
다음은 간단한 get 메소드의를 - 다만 PK에서 작동 - 내가 원하는 정확히. 그래서뿐만 아니라 그들이뿐만 아니라 주문을 반환하도록 요청할 수 있습니다 단지 고객을 반환로 -
public DALEntity Get(string ID)
{
return dbSet.Find(ID);
}
는 지금이 소비자가 포함 목록에 통과 할 수 있도록 변경하고 싶습니다. 여기 제가 곤경에 처하게됩니다. 내가 이렇게하면 :
public DALEntity Get(string ID, IEnumerable<string> IncludeEntities = null)
{
IQueryable<DALEntity> query = dbSet;
query = IncludeEntities.Aggregate(query, (current, includePath) => current.Include(includePath));
}
나는 IQueryable과 함께 find를 사용할 수 없다. 그리고 나는 그것을 포함 할 수 없기 때문에 Find()를 직접 찾을 수 없다. IQueryable에서 대신 lambda를 사용하면 엔티티의 PK를 사용한다고 어떻게 말할 수 있습니까? 나는 일반적인 유형이 "ID"와 같이 잘 정의 된 기본 열 이름을 가진 일부 IPkey 인터페이스를 구현해야한다고 주장하는 제네릭 제약을 가질 수 있다고 생각하지만, 구현해야하는 DBContext에 의해 생성 된 엔티티를 사용할 수 없습니다. 이 인터페이스. 필요한 경우 T4를 변경할 수 있습니다. XML 주석을 너무 많이 회피하지 않도록 이미 변경했습니다. 그러나 누구에게나 간단한 방법이 있습니까? 내가 필요한 것은 포함 목록을 받아들이는 오버로드 된 find()입니다.
내 질문은 포함하는 방법을 사용하는 방법 또는 PK를 알고있는 람다를 작성하는 방법 중 하나입니다. 매개 변수로 이러한 람다를 수신 할 수 없으므로 궁극적으로 WCF 서비스에서 사용하게됩니다.
그럼 난 처음 인정 I 돈을 이것을 이해하지 못한다. - 조금 생각 해봐! 일단 주위에 내 머리가있어 대답 할 것이다 ... ID가 정수 인 곳에서 작동하는 방법은 무엇입니까 (나는 두 가지 오버로드 된 Get()를 가짐) – RBrowning99
내 대답에 몇 가지 설명을 추가했습니다. 그리고 오버로드 된 Get의 경우 int를 string으로 바꾸면 동일한 방식으로 작동합니다. –
이것에 대해 고마워요. 저는 결국 그것을 사용하지 않기로 결정했지만 PK를 얻는 방법을 사용했습니다 (DBContext에서 얻는 방법을 찾은 후에). 마지막에 동적 LINQ를 사용했습니다 - 매우 간단합니다. – RBrowning99