【问题标题】:Convert Func<T, string>[] into Func<T, string[]>?将 Func<T, string>[] 转换为 Func<T, string[]>?
【发布时间】:2009-05-20 13:17:25
【问题描述】:

考虑这个类:

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

【问题讨论】:

    标签: c# .net linq generics


    【解决方案1】:
    public static Func<T, U[]> Combine<T, U>(this Func<T, U>[] functions) {
        return t => functions.Select(fun => fun(t)).ToArray();
    }
    

    我将声明它用于泛型 IEnumerable&lt;Func&lt;T, U&gt;&gt; 而不是数组:

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

    如 cmets 中所述,这不太可能直接与 LINQ to SQL 一起使用。但是,您可以通过 .AsEnumerable() 获取 LINQ to SQL 结果并在客户端处理其余部分。

    【讨论】:

    • 如果这能解决我的问题,给你一个大大的吻。会试一试:-)
    • 这回答了标题中的问题。所以+1。不能解决问题正文中的“来自数据库”问题。
    • 这就是我在解释这段代码时所害怕的。我可以自己在 IQueryably 上执行表达式,但我在 SQL 分析器中看到员工表中的所有字段都是从数据库中检索的。
    • @Andrew:哈哈!这是这几天的主题。 “谢谢。它解决了我的问题。”我有很多答案。但用户不知道他应该点击那个复选标记!
    • @Thomas Stock:使用 Func 真的不可能做到这一点,因为它不是表达式树,而是编译为 IL 的委托。为了能够在数据库上运行它,您必须将表达式本身存储为数据 (Expression>)。
    猜你喜欢
    • 1970-01-01
    • 2011-10-31
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多