我已经看到了不同的示例和问题,但我无法想出如何成功编写此查询。 where子句条件位于filter.condition
中fieldC
我收到此错误。我尝试了不同的东西,但不幸的是我无法理解如何解决它。
无法转换为System.func(int,string)' to' System.func(system.Data.DataRow,int,bool)'
MultipleKeyConditionBuilder.This函数给出了过滤条件。它被定义为。
private object[] GetValueFromLookup(MultipleKeyConditionBuilder filter, string lookupValueField, DataTable datatableLookup)
{
Func<int, string> whereClause = test => filter.Condition;
IEnumerable<object> query =
from rows in datatableLookup.AsEnumerable().Where(whereClause)
select rows.Field<object>(lookupValueField);
return query.ToArray();
}
filter.Condition给出了一个字符串,例如&#34; Project_id = 255454&#34;
答案 0 :(得分:1)
您可以使用此类声明
Func<DataRow, bool> whereClause = test => filter.Condition;
我假设filter.Condition
返回一个布尔值。我测试了这种简化:
Func<DataRow, bool> whereClause = test => true;
<强>更新强>:
filter.Condition
返回一个包含property = 'value'
等语句的字符串。这必须使用一些带有此语句的函数进行求值,插入当前DataRow中的值并返回一个布尔值,如
...
Func<DataRow, bool> whereClause = row => SomeClass.Evaluate(filter.Condition, row);
...
public static class SomeClass
{
public static bool Evaluate(string expression, DataRow data)
{
... do some sophisticated stuff ...
return true / false;
}
}
但是这个解决方案只适合直接回答这个问题。
我建议重新设计MultipleKeyConditionBuilder
,MultipleKeyConditionBuilder.Condition
不会返回string
而是Predicate<DataRow>
。之后你可以写
Func<DataRow, bool> whereClause = test => filter.Condition(test);
答案 1 :(得分:0)
我不知道为什么你把那里的东西复杂化了。
这应该可以胜任。
private object[] GetValueFromLookup(MultipleKeyConditionBuilder filter, string lookupValueField, DataTable datatableLookup)
{
DataRow[] rows = datatableLookup.Select(filter.Condition);
return rows.Select(r => r.Field<object>(lookupValueField)).ToArray();
}
答案 2 :(得分:0)
System.Linq.Enumerable.Where需要Func<T, bool>
(即将T作为输入并返回bool的函数)
行whereClause = test => filter.Condition;
工作filter.Condition
的含义应该是C#代码。在你的情况下,它似乎是一个字符串。
如果我了解您要在此处执行的操作,那么您应该让filter.Condition
返回Expression<Func<DataRow, bool>>
。
以下是一段代码片段,可帮助您了解Expressions的工作原理。
Expression<Func<string, bool>> conditionExpression = x => "MyString".Equals(x);
// Following if block will not compile
//if (conditionExpression("MyString"))
// Console.WriteLine("True");
//else
// Console.WriteLine("False");
var condition = conditionExpression.Compile();
// Following if block will compile.
if(condition("MyString")) //this compiles.
Console.WriteLine("True");
else
Console.WriteLine("False");
希望这有帮助。