2012-01-21 4 views
2

product, sales 등의 모델을 반환하는 일반적인 메서드를 작성하고 싶습니다. 이런 식으로 뭔가 (.NET 3.5, 내가 엔티티 프레임 워크를 사용하여 하지 해요)IEnumerable 문제 <TEntity>

public class ProductRepository<TEntity> : IProduct<TEntity> 
    where TEntity : class 
{  
    public IEnumerable<TEntity> GetProductList(string Type) 
    { 
     IEnumerable<Product> fLit = from p in ProductList 
            select p; 

     return fLit; 
    } 
} 

을하지만 암시 System.Collections.Generic.IEnumerable<TEntity>에 입력 System.Collections.Generic.IEnumerable<Product>을 '변환 할 수 없습니다 다음과 같은 오류

을 얻고있다. 명시 적 변환이 존재합니다 (캐스트가 누락 되었습니까?)

도움을 주시면 감사하겠습니다. 미리 감사드립니다.

+5

컴파일러에서 말하는 것처럼 캐스트를 사용하십시오. –

+1

나는 동의 할 것이고, 궁금하다. 컴파일러 오류 중 어떤 부분이 혼란 스럽거나 명확하지 않은가? –

+1

'string Type' 매개 변수를 삭제할 수 있습니다. 'typeof (TEntity) .FullName'으로 비슷한 정보를 얻을 수 있습니다. –

답변

2

나는 당신이 당신의 도메인의 디자인을 변경해야 두려워, 잘 구현하지 않을 방법 저장소 패턴입니다. 우선 당신은 다음과 같은 간단한 도메인 모델 뭔가를 기본 클래스를 가져야한다 (물론이 필요하지 않습니다) :

public interface IRepository<TEntity> where TEntity : EntityBase { 
    TEntity FindOne(int id); 
} 

:

public class EntityBase { 
    public virtual int Id { get; set; } 
} 

은 다음 일반적인 IRepository 인터페이스가 있어야합니다 당신이 일반적인 IRepository 인터페이스를 구현 한 후 다음과 같이 사용하면 일반적인 인터페이스로부터 상속 된 콘크리트 저장소 클래스가해야

public class Repository<TEntity> : IRepository<TEntity> where TEntity : EntityBase { 
    private readonly DbContext _dbContext; 
    private readonly DbSet<TEntity> _dbSet; 

    public Repository(DbContext dbContext) { 
     _dbContext = dbContext; 

     _dbSet = _dbContext.Set<TEntity>(); 
    } 

    public IQueryable<TEntity> Entities { 
     get { return _dbSet; } 
    } 

    public TEntity FindOne(int id) { 
     return Entities.FirstOrDefault(t => t.Id == id); 
    } 
} 

이 깔끔하네요, 여기에서 볼 수 있듯이 Repository 클래스 생성자에 대한 DbContext 매개 변수가 필요합니다. 또한 우리는 엔티티베이스의 Id 속성을 이용하여 정확히 원하는 것을 찾습니다.

지금까지 리포지토리 패턴의 기초를 구현 했으므로 지금부터 각 도메인 엔터티에 대한 리포지토리 클래스를 만들어야합니다. 의 당신이 여기 부탁 한 것을 구현하자

public class ProductRepository : Repository<Product> { 
    public ProductRepository(DbContext dbContext) 
     : base(dbContext) { 

    } 

    public IEnumerable<Product> GetProductList(string Type) { 
     IEnumerable<Product> fLit = from p in Entities select p; 
     return fLit; 
    } 
} 

희망이 도움이됩니다.

+0

대단한 !!! 정말 고맙습니다. – Yass

+0

:) 기꺼이 당신의 문제를 해결하십시오. – saber

+0

이 접근 방식에 엔티티 프레임 워크가 필요합니까? System.Data.Entity 네임 스페이스를 추가했지만 여전히 DbContext 및 DbSet 개체를 식별하지 못합니까? 내가 놓친 게 있니? – Yass

0

.NET 3.5에서는 이와 같은 제네릭 형식을 변환 할 수 없습니다. 따라서 열거 형을 제네릭 유형으로 유지하십시오.

IEnumberable<TEntity> flit = from p in PRODUCT LIST select p; 
+0

이것은'PRODUCT LIST'도'TEntity'의 일반적인 컨테이너 일 때만 작동합니다. 목록이 실제로 제품의 컨테이너 일 경우 컴파일 오류가 발생한 위치로 이동합니다. –

+0

물론.하지만 질문을 읽으면 모델의 일반 또는 컨테이너 일 가능성이 높습니다. 이전의 경우 : 괜찮아. 늦게, 위와 같이하십시오. –

2

오류가 꽤 분명하다하십시오 TEntity는 제품이 아닌 줄을 변경합니다. 닷넷 4.0에서는이 문제를 해결하기 위해 공분산을 사용할 수 있지만 닷넷 3.5에서 다음을 수행 할 수 있습니다

    where TEntity : class에서 where TEntity : Product에 형 제약 조건을 변경
  1. 을. 메소드에서 이미 이것을 가정하고 있으므로 컴파일러가이를 시행 할 수 있도록하십시오.
  2. 사용 LINQ는 명시 적으로 TEntities에 결과를 캐스팅 : return fLit.Cast<TEntity>();
+0

고맙습니다. 옵션 1은 수업의 목적을 변경합니다. 옵션 2는 정상적으로 작동하지만 유형 캐스팅에 대해 걱정하지 않습니다. – Yass

+0

때때로 캐스팅을 입력해야합니다. 리플렉션과 마찬가지로 위험 할 수는 있지만 사용 용도가 있습니다! –

관련 문제