具有空参数的 Linq 不起作用

本文关键字:Linq 不起作用 参数 | 更新日期: 2023-09-27 18:33:31

我不明白为什么这个查询不起作用,你能帮我吗?

 public static IEnumerable<SelectListItem> MyList(int? id, string name="")
{
 var list =db.Entity
    .Where(p=>
          (name==null? p.Name !=null : p.Name==name) && 
          (id.hasValue || p.Id==id)
    .Select(n=>new SelectListItem()
          {
           Text=n.Name,
           Value=n.Id.ToString()
          }).ToList();
return list;
}

当两个参数都为空时,我想拥有完整列表!! 但是当两个参数都为空时,我得到一个空列表。

代码

片段代码来自一个大方法,其中包含多个像这样的查询。

具有空参数的 Linq 不起作用

如果我

理解正确,您不想在值null时执行过滤。然后你应该写:

.Where(p=>
          (name == null || p.Name == name) && 
          (id == null || p.Id == id)

您应该更改函数的签名,将参数name的默认值设置为 null 而不是空字符串。

public static IEnumerable<SelectListItem> MyList(int? id, string name = null)

根据评论,有两个问题:

首先,你的id条件不太对。其次,name的默认参数是空字符串,而不是 null

但是,还有更多改进的空间:通过在查询中嵌入name == nullid也是如此),查询将以将null检查转换为 SQL 的方式构造。如果在构造查询后有机会name更改其值,那很好,但此处没有发生这种情况的可能性。您可以改为动态构造查询:

我注释掉了p.Name != null支票。如果您的名字可能null,那么根据问题,您不希望它们在name == null时被过滤掉。

public static IEnumerable<SelectListItem> MyList(int? id, string name=null)
{
  IQueryable<Entity> query = db.Entity;
  if (id != null)
    query = query.Where(p => p.Id == id);
  if (name != null)
    query = query.Where(p => p.Name == name);
  //else
  //  query = query.Where(p => p.Name != null);
  return query.Select(...).ToList();
}