C# C使用Linq查询,其中where子句作为dataTable上的变量
我见过不同的例子和问题,但我不知道如何成功地编写这个查询。where子句条件处于filter.condition中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
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");