带有null参数的Linq不起作用

Luc*_*umb 1 c# linq asp.net-mvc

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

 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Mag*_*nus 9

如果我理解正确,您不希望在值为时执行过滤null.然后你应该写:

.Where(p=>
          (name == null || p.Name == name) && 
          (id == null || p.Id == id)
Run Code Online (Sandbox Code Playgroud)

你应该更改为参数的默认值设定的功能的签名namenull,而不是空字符串.

public static IEnumerable<SelectListItem> MyList(int? id, string name = null)
Run Code Online (Sandbox Code Playgroud)


小智 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();
}
Run Code Online (Sandbox Code Playgroud)