где условие во время выполнения

#c# #linq

#c# #linq

Вопрос:

У меня есть код

  DataView res = (from a in dtvw.AsEnumerable()
                         where a.Field<string>(creteriaattributeID) == rightval
                        select a).AsDataView();
  

здесь я хочу получить оператор («== «) во время выполнения, возможно ли это?

Я пытался использовать

 where a.Field<string>(creteriaattributeID)   operator   rightval
  

оператор -> строковая переменная, поэтому это невозможно… Можете ли вы предложить какие-либо другие методы…

Комментарии:

1. Откуда вы знаете, какой оператор следует использовать? Передается ли оно по строке?

Ответ №1:

Вы можете думать о == операторе как о функции, которая принимает две строки и возвращает bool. Так, например Func<string, string, bool> . Можете ли вы просто использовать переменную этого типа:

 Func<string, string, bool> equal = (a,b) => { return a == b; };
Func<string, string, bool> notequal = (a,b) => { return a != b; };

DataView res = (from a in dtvw.AsEnumerable()
                where equal(a.Field<string>(creteriaattributeID), rightval)
                    select a).AsDataView();
  

Комментарии:

1. это очень приятно.. но не могу ли я использовать оператор во время выполнения? потому что мне нужно написать еще много функций…

2. с какими различными операторами вы хотите работать? Чем оператор отличается от пользовательской функции? Для меня это то же самое, поэтому я не уверен, что вас беспокоит…

3. 1 @OP Если вы хотите преобразовать пользовательский ввод в оператор во время выполнения, просто используйте оператор switch или его эквивалент, чтобы назначить правильный оператор переменной Func.

Ответ №2:

вы должны создавать и выражать динамически

Т.е.

 Expression<Func<int, bool>> lambda1;

if(paramOperator=="=="){
 ParameterExpression stringParam = Expression.Parameter(typeof(string), "a");
            ConstantExpression criteriaValue = Expression.Constant(rigthval, typeof(string));
            BinaryExpression comparison= Expression.Equals(stringParam , criteriaValue );
            lambda1 =
                Expression.Lambda<Func<string, bool>>(
                    comparison,
                    new ParameterExpression[] { stringParam });
}

DataView res = dtvw.AsEnumerable().Where(lamda1.Compile()).AsDataView(); 
  

Комментарии:

1. это должно работать в каждой среде выполнения .net, которая поддерживает .net LINQ, которую я не тестировал, но я считаю, что это даст вам хорошее начало

2. @Abhijith Nayak — этот код выполняется на сервере, и поэтому конкретный браузер совершенно не имеет значения. То же выражение будет работать в консольном приложении или приложении winform (= нет asp.net вообще).

3. это приводит к некоторым ошибкам при компиляции… можете ли вы отладить это и предоставить работающий код?

Ответ №3:

Не понимаю проблему, код скомпилирован идеально для меня.

 DataTable dtvw = new DataTable();

DataView res = (from a in dtvw.AsEnumerable()
                where a.Field<string>(10) == "12"
                select a).AsDataView();
  

Комментарии:

1. Я предполагаю, что OP хочет решить во время выполнения, какой оператор использовать.

2. хорошо .. тогда я бы рекомендовал то же решение, что и вы написали.

Ответ №4:

Операторов не так много, так почему бы не закодировать это жестко?

 DataView res;

switch (theOperator)
{
  case "==":
    res = (from a in dtvw.AsEnumerable()
                     where a.Field<string>(creteriaattributeID) == rightval
                    select a).AsDataView();
    break;
  case "!=":
    res= (from a in dtvw.AsEnumerable()
                     where a.Field<string>(creteriaattributeID) != rightval
                    select a).AsDataView();
    break;
  // and so on
}
  

Ответ №5:

Похоже, что вы работаете над LINQ для наборов данных. Если это так, почему бы не использовать собственный DataTable.Выберите метод (string), в котором вы все равно можете просто передать оператор в виде строки. Альтернатива динамического построения выражений намного более болезненна. LINQ гораздо больше подходит для запроса во время компиляции, чем для запроса во время выполнения.