我正在尝试创建一种在数据表上运行一些动态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
答案 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 案例的选择表达式不是必需的,投影决不会影响计数。