2009-05-20 8 views
3

Func <T, string> []을 Func <T, string[]>로 변환 하시겠습니까?

이 클래스를 고려하십시오.

public class Column<T> 
{ 
    public string Header { get; set; } 
    public Func<T, string> ValueExpression { get; set; } 
} 

다음과 같이 사용 :

var columns = new List<Column<Employee>> 
       { 
        new Column<Employee> {Header = "Employee Id", ValueExpression = e => e.EmployeeID.ToString()}, 
        new Column<Employee> {Header = "Name", ValueExpression = e => e.FirstName + " " + e.LastName}, 
        new Column<Employee> {Header = "Employee Birthday Year", ValueExpression = e => e.BirthDate.HasValue ? e.BirthDate.Value.Year.ToString() : ""}, 
        new Column<Employee> { Header = "test", ValueExpression = e => e.Address} 
       } 

IQueryable에서 .Select()를 수행하여 데이터베이스에서 필요한 필드 만 검색하도록하고 싶습니다.

그래서 이렇게하고 싶습니다 :

var expressions = columns.Select(c => c.ValueExpression).Combine(); 
IQueryable<Employee> employees = EmployeeRepository.GetEmployees(); 
employees = employees.Select(expressions); 

"Combine()"은 분명히 존재하지 않습니다. :-)

답변

6
public static Func<T, U[]> Combine<T, U>(this Func<T, U>[] functions) { 
    return t => functions.Select(fun => fun(t)).ToArray(); 
} 

내가 제네릭에 대한 것을 선언 할 것 .. :-)

var expressions = columns.Select(c => c.ValueExpression).Combine(); 
IQueryable<Employee> employees = EmployeeRepository.GetEmployees(); 
employees = employees.Select(expressions); 

만 "(결합)"분명히 존재하지 않습니다

그래서 나는 이런 일을하고 싶지 대신 배열의 IEnumerable<Func<T, U>>는 :

의견에서 언급 한 바와 같이
public static Func<T, IEnumerable<U>> Combine<T, U>(this IEnumerable<Func<T, U>> functions) 
{ 
    return t => functions.Select(fun => fun(t)); 
} 

,이 LINQ와 직접 작동 할 가능성이 없습니다 SQL에. 그러나 .AsEnumerable()을 수행하여 LINQ를 SQL 결과로 가져 와서 클라이언트 측에서 나머지를 처리 ​​할 수 ​​있습니다.

+0

내 문제를 해결하면 큰 키스를받습니다. 그것을 줄 것입니다 :-) –

+0

@Mehrdad : 잘하면 그는 대답도 받아 들일 것입니다. :) –

+0

제목에있는 질문에 대한 대답입니다. 그래서 +1. 질문의 본문에서 "데이터베이스에서"문제를 해결하지 않습니다. –

관련 문제