如何在Where部分的IEnumerable中设置参数

时间:2017-12-27 09:28:41

标签: c# asp.net entity-framework linq ienumerable

我不知道 - 我可以在IEnumerable的Where部分传递特定参数吗? 例如,我有这样的查询:

responseType

IEnumerable<Bla> quer = quer.Where(e => e.actual == 1 && param); 将是这样的

param

我认为可以通过 e.Number > 5 完成,但也许可以使用泛型? 我使用EF,它是Web Forms。

IsNullOrEmpty

4 个答案:

答案 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允许您在paramnull时默认结果。现在,如果trueparam,它将返回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);