Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C使用Linq查询,其中where子句作为dataTable上的变量_C#_Linq_Dynamic_Where Clause_Linq To Objects - Fatal编程技术网

C# C使用Linq查询,其中where子句作为dataTable上的变量

C# C使用Linq查询,其中where子句作为dataTable上的变量,c#,linq,dynamic,where-clause,linq-to-objects,C#,Linq,Dynamic,Where Clause,Linq To Objects,我见过不同的例子和问题,但我不知道如何成功地编写这个查询。where子句条件处于filter.condition中 private object[] GetValueFromLookup(MultipleKeyConditionBuilder filter, string lookupValueField, DataTable datatableLookup) { Func<int, string> whereClause = test => fi

我见过不同的例子和问题,但我不知道如何成功地编写这个查询。where子句条件处于filter.condition中

  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();

    }
我得到了这个错误。我尝试过不同的事情,但不幸的是我不知道如何解决它

无法从“System.func int,string”转换为“System.funcsystem.Data.DataRow,int,bool”

MultipleKeyConditionBuilder。此函数提供筛选条件。它被定义为

public MultipleKeyConditionBuilder(List<string> sourceKeyFieldsList, List<string> referenceKeyFieldsList, DataRow sourceRow) {} 

filter.Condition给出一个字符串,例如Project_id=255454

您可以使用这样的声明

 Func<DataRow, bool> whereClause = test => filter.Condition;
更新:

条件返回一个字符串,其中包含类似property='value'这样的语句。必须使用一些函数来计算它,这些函数接受该语句,插入当前数据行中的值,并返回一个布尔值,如

    ...
    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;
     }
}

我不知道你为什么把那里的事情搞复杂了

这应该可以完成任务

private object[] GetValueFromLookup(MultipleKeyConditionBuilder filter, string lookupValueField, DataTable datatableLookup)
{
    DataRow[] rows = datatableLookup.Select(filter.Condition);
    return rows.Select(r => r.Field<object>(lookupValueField)).ToArray();
}

System.Linq.Enumerable.Where需要一个Func,即一个以T作为输入并返回bool的函数 您的行whereClause=test=>filter.Condition的含义;运行过滤器。条件应为C代码。在你的情况下,这似乎是一个字符串

如果我理解您在这里尝试执行的操作,那么您应该让filter.Condition返回一个表达式

下面是一段代码片段,帮助您了解表达式的工作原理

        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");

希望这有帮助。

filter.Condition返回字符串现在只有最后一部分不同。如何将其更改为bool或其他字符串?如何定义MultipleKeyConditionBuilder?公共MultipleKeyConditionBuilderList sourceKeyFieldsList、List referenceKeyFieldsList、DataRow sourceRow{}和MultitpileKeyConditionBuilder.Condition?datatableLookup.Select很慢。我想提高性能。这就是我使用Linq的原因。我试过数据视图,但也不是beneficial@Masood编辑您的问题并对MultipleKeyConditionBuilder进行一些说明。如何准备筛选器?此函数向条件变量添加字符串以生成条件:它非常适合数据表select语句,但对于linq它不起作用编辑您的问题并说明MultipleKeyConditionBuilder是否可以有多个条件?如果有多个筛选器,筛选器条件的值是多少?是,它有多个条件,。视情况而定。”条件+=referenceKeyFieldsList[i]。ToValidSQLName+=+filterChar+sourceRow[sourceKeyFieldsList[i]]+filterChar;'你应该看一看,而且
private object[] GetValueFromLookup(MultipleKeyConditionBuilder filter, string lookupValueField, DataTable datatableLookup)
{
    DataRow[] rows = datatableLookup.Select(filter.Condition);
    return rows.Select(r => r.Field<object>(lookupValueField)).ToArray();
}
        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");