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

问题描述 投票:0回答:4

我不知道 - 我可以在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; }

    }
c# asp.net entity-framework linq ienumerable
4个回答
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));

?? trueparam时,null允许你默认结果。现在它将返回true,如果paramnull,但你可以改变它,如果你想。

由于您正在运行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);

0
投票

任何linq中的条件的参数总是产生一个布尔值。那就是e.actual == 1是布尔结果,无论是true还是flase。就像它将是一个param也需要布尔值。 var param = e.Number> 5 okay但var param =“e.Number> 5”不行。


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);

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);
© www.soinside.com 2019 - 2024. All rights reserved.