我不知道 - 我可以在IEnumerable的Where部分传递特定参数吗?例如,我有这样的查询:
IEnumerable<Bla> quer = quer.Where(e => e.actual == 1 && param);
param
会是这样的
e.Number > 5
我认为可以通过IsNullOrEmpty
完成,但也许可以使用泛型?
我使用EF,它是Web Forms。
public class BLA
{
[Key]
public int IDin { get; set; }
public int actual { get; set; }
public string code { get; set; }
public DateTime Date { get; set; }
}
如果你将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);
任何linq中的条件的参数总是产生一个布尔值。那就是e.actual == 1是布尔结果,无论是true还是flase。就像它将是一个param也需要布尔值。 var param = e.Number> 5 okay但var param =“e.Number> 5”不行。
您可以使用参数,并将其添加到查询中
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);
只有在需要时才可以应用第二个条件,如下所示:
// 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);