考虑我有以下linq查询。我想将where子句中的条件指定为字符串,因为当我没有任何条件时我将使其为空。但是这样做我得到错误: " 无法将字符串转换为bool "。我知道错误的原因。我只想知道是否有其他替代方法可以实现以下内容。
var elements = from element in array
orderby element descending
where element > 2
select element;
字符串条件="元素>" +2;
我想做以下事情......
var elements = from element in array
orderby element descending
where condition<------------
select element;
PS:我会在没有条件的情况下处理这种情况,并且where子句没有条件。
提前致谢...
答案 0 :(得分:1)
您可以将此条件拆分为两个,例如
var elements = array.OrderByDescending(o => o);
if (put some condition for active where )
elements= elements.Where(o=>o>2);
答案 1 :(得分:1)
编译器将查询语法转换为普通语法,因此您的示例等同于:
var elements = array.OrderByDescending(element => element).Where(element => element > 2);
OrderByDescending
和Where
都会返回IEnumerable<T>
。 Where
的作用是插入Func<T, bool>
作为过滤器,因此当您遍历可枚举时,它会为每个元素调用该函数,并在函数返回false时跳过该元素。如果您没有条件,可以直接拨打Where
的电话:
var elements = array.OrderByDescending(element => element);
如果稍后您只需要选择某些元素,则可以将过滤器应用于元素:
elements = elements.Where(element => element > 2);
如果过滤器依赖于用户输入,则可以使用闭包(捕获外部变量的函数):
public Func<int, bool> CreateFilter(int value)
{
// This returns a function that 'remembers' the given value:
return element => element > value;
}
然后可以使用:
int userInput = 5;
elements = array.OrderByDescending(element => element).Where(CreateFilter(userInput));