2009-05-20 9 views
3

Betrachten Sie diese Klasse:Konvertieren Func <T, string> [] in Func <T, string[]>?

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

wie folgt verwendet:

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} 
       } 

Ich möchte eine .Select() auf einem IQueryable tun es nur, um die benötigten Felder aus der Datenbank abgerufen werden.

Deshalb möchte ich, so etwas tun:

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

Nur "Combine()" offensichtlich nicht existiert .. :-)

Antwort

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

ich, dass für generische erklären würde IEnumerable<Func<T, U>> statt Array:

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

Wie in den Kommentaren erwähnt, ist dies wahrscheinlich nicht direkt mit LINQ arbeiten zu SQL. Sie können jedoch LINQ to SQL-Ergebnisse abrufen, indem Sie eine .AsEnumerable() tun und den Rest auf der Clientseite verarbeiten.

+0

Ein großer Kuss für Sie, wenn dies mein Problem löst. Werde es versuchen :-) –

+0

@Mehrdad: Hoffentlich wird er die Antwort auch akzeptieren. :) –

+0

Dies beantwortet die Frage im Titel. Also +1. Löst das "von der Datenbank" Problem im Körper der Frage nicht. –

Verwandte Themen