Linq:如果参数为空,如何排除条件

本文关键字:何排除 排除 条件 如果 参数 Linq | 更新日期: 2023-09-27 18:08:38

我有一些表和以下查询条件:如果参数A是空取全部,如果不是,在查询中使用它。我知道如何在两个步骤中做到这一点:

List<O> list = null;
if (A = null)
{
    list = context.Obj.Select(o => o).ToList();
}
else
{
    list = context.Obj.Where(o.A == A).ToList();
}

是否有可能有相同的一个查询?由于

Linq:如果参数为空,如何排除条件

如何:

list = context.Obj.Where(o => A == null || o.A == A)
                  .ToList();

您可以在一个查询中完成,但仍然使用条件:

IEnumerable<O> query = context.Obj;
if (A != null)
{
    query = query.Where(o => o.A == A);
}
var list = query.ToList();

或者您可以使用条件运算符将查询放在单个语句中:

var query = A is null ? context.Obj : context.Obj.Where(o => o.A == A);
var list = query.ToList();

我个人建议后一种选择,因为它们不要求LINQ提供程序能够在A为空的情况下优化过滤器。(我希望大多数好的LINQ提供程序/数据库能够做到这一点,但我通常会避免在不需要时指定过滤器。)

我选择了

var list = context.Obj.Where(o => A.HasValue ? o.a == A : true);

我可能会这样写查询:

IQueryable<O> query = context.Obj;
if (A != null)
    query = query.Where(o => o.A == A);
var list = query.ToList()

这不是一个表达式,但我认为它是相当可读的。

同样,这段代码假设context.ObjIQueryable<O>(例如,您正在使用LINQ to SQL)。如果不是这种情况,只需使用IEnumerable<O>