带有null参数的Linq不起作用

时间:2016-02-06 09:39:04

标签: c# asp.net-mvc linq

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

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

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

代码段来自一个包含多个查询的大方法。

2 个答案:

答案 0 :(得分:9)

如果我理解正确,您不希望在值为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)

答案 1 :(得分:5)

根据评论,有两个问题:

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

但是,还有更多改进的余地:通过在查询中嵌入name == null(和id相同),您的查询将以翻译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();
}