복붙노트

[SQL] 동적으로 생성 된 테이블에서 엔티티 프레임 워크를 사용하여 데이터를 쿼리

SQL

동적으로 생성 된 테이블에서 엔티티 프레임 워크를 사용하여 데이터를 쿼리

TLDR; 어떻게 테이블 이름이 컴파일 타임에 알 수없는 엔티티 프레임 워크를 사용하여 테이블에서 데이터를 읽을 수 있습니까?

정보의 대량을 처리 한 다음 해당 테이블에서 일부 데이터를 각각 배치 실행을 위해 새 테이블을 생성하고 저장하는 외부 시스템이있다. 나는 동일한 열 레이아웃이있는 테이블이 기존 데이터베이스에서 ADO.NET 엔터티 데이터 모델 (edmx 파일)를 생성 한 있도록 새로운 테이블의 열 레이아웃은, 전에 손으로 알려져있다.

해당 테이블을 나타내는 엔티티 클래스도 ResultTableTemplate라고 있도록 해당 데이터베이스의 원래 테이블, ResultTableTemplate이라고합니다.

나는 그 동적으로 생성 된 테이블에서 읽어 내 ADO.NET 엔터티 데이터 모델을 사용하는 방법을 알아 내려고 노력하고는 IEnumerable 을 다시 얻고있다. 내가 지금까지했던 것은 이것이다 :

public IEnumerable<ResultTableTemplate> GetResultsFromTable(string tableName) {
    using (var context = new WorkdataEntities()) {
        var table = context.CreateQuery<ResultTableTemplate>("SELECT " +
            "ALL_THOSE_COLUMN_NAMES... " +
            "FROM " + tableName;

        var query = from item in table select item;

        return query.ToList();
    }
}

내가 쿼리를 실행하면, 나는 다음과 같은 메시지와 함께 System.Data.Entity SQLEXCEPTION를 얻을 :

ResultTable419828는 TABLENAME의 값

나는 TABLENAME + "AS ResultTableTemplate"을 시도했지만 그것은 도움이되지 않았다.

방법이 나를 위해 앞으로 있는가, 아니면 내가 엔티티 프레임 워크의 도움없이이 작업을 수행해야합니다?

편집 : 나는 그것이 자동 중 ResultTable419828를 찾습니다 있도록 쿼리 텍스트 내가 쓰기가 기본이되는 SQL Server 인스턴스에 이르기까지 모든 방법을 전달되지 있지만하여 ObjectQuery 인스턴스를 반환 엔티티 프레임 워크에 의해 해석됩니다 오전 현재 실현 컨텍스트의 생성 DbSet 인스턴스.

그럼에도 불구하고, 내가해야 할 일을 달성 할 저를위한 방법은 무엇입니까?

편집 : 감사합니다 라디 Mrnka. 지금, 나는이 작업을 수행 :

public IEnumerable<ResultTableTemplate> GetResultsFromTable(string tableName) {
    using (var context = new WorkdataEntities()) {
        var query = context.ExecuteStoreQuery<ResultTableTemplate>("SELECT " +
            "ALL_THOSE_COLUMN_NAMES... " +
            "FROM " + tableName;

        return query.ToList();
    }
}

해결법

  1. ==============================

    1.그것은 바로 수 없습니다. 당신이 ResultTableTemplate에 개체를 매핑 할 때이 엔티티 테이블의 이름을 하드 코딩. 엔티티 (모델 당) ResultTableTemplate 테이블에 쿼리 그래서 런타임 모든 EF 쿼리에 대해이 엔티티 항상 결과를 한 번만 매핑 할 수 있습니다.

    그것은 바로 수 없습니다. 당신이 ResultTableTemplate에 개체를 매핑 할 때이 엔티티 테이블의 이름을 하드 코딩. 엔티티 (모델 당) ResultTableTemplate 테이블에 쿼리 그래서 런타임 모든 EF 쿼리에 대해이 엔티티 항상 결과를 한 번만 매핑 할 수 있습니다.

    변화에 대한 유일한 방법은 동작이 XML 파일을 변경하고 다시로드를 필요로하기 때문에 매우 추한 해킹 런타임에 매핑 파일 (SSDL)를 수정이다. 수동으로 파일을 변경할 때마다의 MetadataWorkspace을 구축해야합니다. 건물의 MetadataWorkspace는 EF에서 가장 성능이 소요되는 작업 중 하나입니다. 정상적인 실행에서의 MetadataWorkspace은 응용 프로그램 실행에 한 번 생성됩니다.

    간단한 해결 방법은 있습니다. 당신은 테이블의 이름을 알고 당신은 테이블 구조를 알고 -이 고정됩니다. 그래서 매핑 된 엔티티 클래스에 결과를 실현하기 위해 직접 SQL을 사용하여 EF를 사용합니다 :

    var table = context.ExecuteStoreQuery<ResultTableTemplate>("SELECT ... FROM " + tableName);
    

    단점은이 방법에 Linq에를 사용할 수 없다는 것입니다 그러나 당신의 요구 사항은 아주 잘 EF에 적합하지 않습니다.

  2. ==============================

    2.이 시도; :)

    이 시도; :)

    string tableName = "MyTableTest";
    
    // Fetch the table records dynamically
    var tableData = ctx.GetType()
                    .GetProperty(tableName)
                    .GetValue(ctx, null);
    
  3. from https://stackoverflow.com/questions/8896843/querying-data-using-entity-framework-from-dynamically-created-table by cc-by-sa and MIT license