我不明白为什么这个查询不起作用,你能帮我吗?
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;
}
当两个参数都为空时我想拥有完整的列表!!但是当两个参数都为空时,我得到一个空列表。
代码段来自一个包含多个查询的大方法。
答案 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();
}