#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 гораздо больше подходит для запроса во время компиляции, чем для запроса во время выполнения.