将委托表达式添加为参数

时间:2014-02-06 16:41:19

标签: c# linq datasetextensions

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

基本上我想在方法中添加第二个参数,该方法将包含一个可用于替换r =>的表达式。 r.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 =&gt;的内容。 r.Field(“sometextfield”)或r =&gt; r.Field(“somenumberfield”)或提出替代方法的建议。

由于

CD

1 个答案:

答案 0 :(得分: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&lt; FUNC&LT;&GT; &gt;,您只需使用Func&lt;&gt;。

Count 案例的选择表达式不是必需的,投影决不会影响计数。