我不知道 - 我可以在IEnumerable的Where部分传递特定参数吗? 例如,我有这样的查询:
responseType
IEnumerable<Bla> quer = quer.Where(e => e.actual == 1 && param);
将是这样的
param
我认为可以通过 e.Number > 5
完成,但也许可以使用泛型?
我使用EF,它是Web Forms。
IsNullOrEmpty
答案 0 :(得分:4)
如果您将param
定义为一个函数(Func<Bla, bool>
是准确的),您可以调用它:
Func<Bla, bool> param = bla => bla.Number > 5;
并称之为:
IEnumerable<Bla> quer = quer.Where(e => e.actual == 1 && (param?.Invoke(e) ?? true));
?? true
允许您在param
为null
时默认结果。现在,如果true
为param
,它将返回null
,但如果您愿意,可以更改。
由于您正在运行EF,因此无法使用上述方法。
您可以使用Expression<Func<Bla, bool>>
。表达式可以通过EF转换为实际的SQL:
Expression<Func<Bla, bool>> param = bla => bla.Number > 5;
IEnumerable<Bla> quer = quer.Where(e => e.actual == 1)
.Where(param);
对于更复杂的功能,您必须首先实现结果:
IEnumerable<Bla> quer = quer.Where(e => e.actual == 1)
.ToList() // materialize
.Where(e => param?.Invoke(e) ?? true);
答案 1 :(得分:0)
任何linq中的条件总是产生布尔值的参数。 那就是e.actual == 1是布尔结果,无论是true还是flase。就像它将是一个param也需要布尔值。 var param = e.Number&gt; 5好吧但var param =“e.Number&gt; 5”不行。
答案 2 :(得分:0)
只有在需要时才能应用第二个条件,如下所示:
// Always apply first condition:
IEnumerable<Bla> query = quer.Where(e => e.actual == 1);
// When needed, also apply second condition:
int? valueToCheck = someValue; // or null
if (valueToCheck.HasValue)
{
query = quer.Where(e.Number > valueToCheck.Value);
}
但是,如果你甚至需要改变e.Number >
部分,那么这种方法将不那么容易理解。
它也可以写得更短(也许更具可读性),如下所示:
int? valueToCheck = someValue; // or null
IEnumerable<Bla> query = quer
.Where(e => e.actual == 1);
.Where(e => valueToCheck == null || e.Number > valueToCheck.Value);
答案 3 :(得分:0)
您可以使用参数,并将其添加到查询
Expression<Func<Bla, bool>> param = bla => bla.Number > 5;
IEnumerable<Bla> query = query.Where(e => e.actual == 1).Where(param);
由于它是两次调用,如果它为null,你可以简单地省略第二次调用。
public void SomeMethod(Expression<Func<Bla, bool>> param) {
IEnumerable<Bla> query = quer.Where(e => e.actual == 1).Where(param);
if (param != null) {
query = query.Where(param);
}
// ...
}
// Usage
SomeMethod(null);
// or
SomeMethod(bla => bla.Number > 5);