1

기본 KVP 데이터를 저장하는 SQL 데이터베이스에 여러 개의 테이블이 있습니다. 그들은 모두 Id (int), Description (varchar (..))의 패턴을가집니다.DBSet을 익명 메서드로 인터페이스에 캐스팅하는 방법 - E.F

모두 MVC 응용 프로그램의 한 단계 또는 다른 단계에서 모두 필요하며 엔티티 클래스 유형을 가져 와서 해당 항목 데이터의 목록을 반환하는 익명 메소드를 만들려고합니다. 나는 너무 많이 쓰고있는 메서드를 확장하지 않고도 데이터베이스의 테이블 수에 관계없이이 메서드를 사용할 수 있기를 원합니다.

예 데이터 :

  • ID : 1 설명 : 레드
  • ID : 2 설명 : 블루
  • ID : 3 설명 : 녹색

ISET 구현 :

public interface ISet 
{ 
    int Id { get; set; } 
    string Description { get; set; } 
} 

가능한 방법 구현

public static IList<T> BuildSet<T>() 
{ 
    using (var db = new somethingEntities()) 
     return db.Set(typeof(T)).Cast<ISet>().Select(c => new { c.Id, c.Description }).ToList(); 
} 

사람이 수행하는 방법을 알고 있나요

Cannot create a DbSet<ISet> from a non-generic DbSet for objects of type 'YourType'. 

사용

var data = BuildSet<YourType>(); 

런타임 오류 이?

감사합니다.

답변

0

내가들 ToList() 작은있는 DbSet '이 한 번에 모든 결과를 가져올 것이라고 생각?

그러나, 여기에 코드의 간단한 버전은 (는 제네릭 형식 제약의 인터페이스 ISet 지정)입니다 :

public IEnumerable<ISet> BuildSet<T>(this DbContext context) 
    where T : class, ISet 
{ 
    return context.Set<T>().AsEnumerable(); 
} 
:

public static IList<ISet> BuildSet<T>() 
    where T : class, ISet 
{ 
    using (var db = new somethingEntities()) 
     return db.Set<T>().ToList(); 
} 

또한 DbContext에 대한 확장 방법의 옵션이있다

당신이 컨텍스트의 수명 내에서 사용할 수 있으므로보다 효율적인 작업이 가능합니다. (내가 너무 많이 추측하고 있다는 것을 알고 있지만, 유용한 정보라고 생각합니다.)

public void SomeOperation() 
{ 
    using (var db = new somethingEntities()) 
    { 
     foreach (var item in db.BuildSet<SimpleSet>()) 
     { 
      //do something with item 
      //SaveChanges() every 100 rows or whatever 
     } 
    } 
} 
0

문제가 해결되었습니다.

방법 선언

public static List<ISet> BuildSet<T>() where T : class 
{ 
    using (var db = new somethingEntities()) 
     return db.Set<T>().ToList().Cast<ISet>().ToList(); 
} 

사용

var data = ...BuildSet<YourType>(); 
관련 문제