2017-05-10 1 views
0

370 열이 포함 된 내 엔터티에 테이블이 있습니다! 또한 런타임 전에 알 수없는 문자열 배열이 있습니다 (웹 사이트에서 제공).문자열 배열의 열만 표시

예컨대 :

string [] columns = {"column1", "column2", "column3"} 

어떻게 내가주는 열이 나에게 결과만을 제공합니다 나의 엔티티에 LINQ를 발사 할 수 있습니까?

몇 시간 동안 수색했지만 지금까지는 제안하지 않습니까?

답변

0

이것은 Linq-to-Entities로 할 수있는 것이 아닙니다. 코드에서 열을 선언 할 수 있어야합니다.

더 나은 방법은 Sql에서 배열의 열 이름을 사용하여 쿼리를 만들고 Dapper 같은 것을 사용하여 결과를 개체에 매핑하는 것입니다.

+0

이것은 사실이 아니다. 리플렉션 –

+0

을 사용할 수 있으며 리플렉션을 어떻게 사용할 수 있습니까? 예가 있습니까? – fahr

+0

리플렉션과 함께 작동한다고해도 LINQ to Entities에 적합하지 않은 전형적인 사용 사례입니다. 엔티티에 대한 LINQ는 C# 클래스 (엔티티)가 있고 그 엔티티를 기반으로 쿼리를 만들 때 이상적입니다. 여기에서는 오래된 학교의 'DataReader'가 훨씬 더 적합합니다. – LueTm

0

Delegate에서 ExpandoObject를 인스턴스화하고 Reflection을 사용하여 들어오는 배열에 지정된 열을 가져올 수 있습니다.

다음 :

if(PI.Name == "Desired column"){ // Or Array index 

     // Add to Out: 
     Out.Add(PI.Name, PI.GetValue(Row)) 

    } 
0

:

List<IDictionary<String, Object>> List = Context.Row_Type.Select(delegate(Row_Type Row) { 

     IDictionary<String, Object> Out = new ExpandoObject() as IDictionary<String, Object>; 

     PropertyInfo[] PIs = Row.GetType().GetProperties(); 

     foreach(PropertyInfo PI in PIs) { 
     if(PI.GetIndexParameters().Length == 0) { 
      Out.Add(PI.Name, PI.GetValue(Row)); 
     } 
     } 

     return Out; 

    }).ToList(); 

원하는 열을 그냥 PI.Name에 의해 차별을 반환하는 모든 속성 목록 < IDictionary < 문자열, 개체 >> 돌아갑니다 컬럼 이름을 알 수없는 클래스를 반환하고 싶지는 않다고 생각합니다. 열 이름과 값의 사전을 사용할 수 있습니까? 검색어는 여전히 모든 열을 가져와야하지만 관심있는 검색어 만 반환 할 수 있습니다. 당신이 모음이있는 경우

string [] columns = {"column1", "column2", "column3"} 

var entity = GetEntity(); 
var dictionary = columns.ToDictionary(c => c, c => entity.GetType().GetProperty(c).GetValue(entity)); 

또는은 ...

var entities = GetEntities(); 
var results = entities 
    .Select(e => columns.ToDictionary(c => c, c => e.GetType().GetProperty(c).GetValue(e))); 
+0

와우 - 정말 멋지다. 내 문제를 해결했다. 내가 필요한 바로 그 것이다. 많이 Thx * thumbsUp * – fahr