C# Использование Linq Query с предложением where в качестве переменной для dataTable
Я видел разные примеры и вопросы, но не могу понять, как успешно написать этот запрос. Условие предложения 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.func (system.Data.DataRow, int, bool)'
MultipleKeyConditionBuilder. Эта функция задает условие фильтра. Это определяется как.
public MultipleKeyConditionBuilder(List<string> sourceKeyFieldsList, List<string> referenceKeyFieldsList, DataRow sourceRow) {}
filter.Condition дает строку, например, "Project_id = 255454"
3 ответа
Вы можете использовать объявление как это
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);
Я не знаю, почему вы все усложнили.
Это должно сделать работу.
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>
(т.е. функция, которая принимает T в качестве входных данных и возвращает bool), что означает для вашей строки whereClause = test => filter.Condition;
работать filter.Condition
должен быть код C#. В вашем случае это выглядит как строка.
Если я понимаю, что вы пытаетесь сделать здесь, вы должны иметь filter.Condition
вернуть Expression<Func<DataRow, bool>>
,
Ниже приведен фрагмент кода, который поможет вам понять, как работают выражения.
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");
Надеюсь это поможет.