C#使用Linq Query将where子句作为dataTable的变量

时间:2016-09-05 10:21:19

标签: c# linq dynamic where-clause linq-to-objects

我已经看到了不同的示例和问题,但我无法想出如何成功编写此查询。 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;

3 个答案:

答案 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;
     }
}

但是这个解决方案只适合直接回答这个问题。

我建议重新设计MultipleKeyConditionBuilderMultipleKeyConditionBuilder.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");

希望这有帮助。