将Func<T, string>[]转换为Func<T, string[]>?

3

考虑以下类:

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()”并不存在.. :-)

1个回答

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

我认为对于通用的 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 to SQL一起使用。但是,您可以通过执行.AsEnumerable()来获取LINQ to SQL结果,并在客户端上处理其余部分。


如果这解决了我的问题,我会给你一个大大的亲吻。我会尝试一下 :-) - Thomas Stock
这回答了标题中的问题。所以+1。但并没有解决问题主体中“来自数据库”的问题。 - Amy B
这就是我在解释这段代码时担心的事情。我可以自己执行IQueryably上的表达式,但是我在SQL分析器中看到从Employees表检索了所有字段。 - Thomas Stock
@Andrew:哈哈!这是最近的主题。我有很多答案都是“谢谢,它解决了我的问题。”但用户不知道他应该点击那个勾选标记! - Mehrdad Afshari
@Thomas Stock:使用Func<T, U>实际上无法做到这一点,因为它不是表达式树,而是编译为IL的委托。要能够在数据库上运行它,您必须采用将表达式本身作为数据存储的方法(Expression<Func<T,U>>)。 - Mehrdad Afshari
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接