0

我正在尝试创建一种在数据表上运行一些动态 linq 的方法,我粘贴的代码是测试代码,而不是我正在处理的完整代码,但我认为这足以理解我正在尝试做的事情.

本质上,我想向该方法添加第二个参数,该参数将包含一个可用于替换 r => r.Field("field") 的表达式。

public string GetStringValueFromData(DataTable data)
{
    switch (this.MethodType)
    {
        case (LabelMethodType.Count):
            return data.AsEnumerable().Select(r => r.Field<string>("sometextfield")).Count().ToString();
        case (LabelMethodType.Sum):
            return data.AsEnumerable().Sum(r => r.Field<decimal>("somenumberfield")).ToString();
        case (LabelMethodType.Average):
            return data.AsEnumerable().Average(r => r.Field<decimal>("anotherfield")).ToString();
    }

    return string.Empty;
}

所以本质上该方法看起来像这样。但是当然我已经尝试过了,它甚至没有编译。

public string GetStringValueFromData(DataTable data, Expression<Func<DataRow, object>> expression)
{
    switch (this.MethodType)
    {
        case (LabelMethodType.Count):
            return data.AsEnumerable().Select(expression).Count().ToString();
        case (LabelMethodType.Sum):
            return data.AsEnumerable().Sum(expression).ToString();
        case (LabelMethodType.Average):
            return data.AsEnumerable().Average(expression).ToString();
    }

    return string.Empty;
}

有谁可能知道什么类型可以使这个参数起作用,所以它会接受类似 r => r.Field("sometextfield") 或 r => r.Field("somenumberfield") 或有建议替代方法。

谢谢

光盘

4

1 回答 1

0

这应该按预期工作:

public string GetStringValueFromData(DataTable data, Func<DataRow, object> expression)
{
    switch (this.MethodType)
    {
        case (LabelMethodType.Count):
            return data.AsEnumerable().Select(expression).Count().ToString();
        case (LabelMethodType.Sum):
            return data.AsEnumerable().Select(expression).Cast<int>().Sum().ToString();
        case (LabelMethodType.Average):
            return data.AsEnumerable().Select(expression).Cast<int>().Average().ToString();
    }

    return string.Empty;
}

笔记:

您不需要使用 Expression<Func<> >,您可以只使用 Func<>。

Count案例的Select表达式不是必需的,投影永远不会影响计数。

于 2014-02-06T16:58:15.643 回答