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

Надеюсь это поможет.

Другие вопросы по тегам