具有空参数的 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;
}
当两个参数都为空时,我想拥有完整列表!! 但是当两个参数都为空时,我得到一个空列表。
代码片段代码来自一个大方法,其中包含多个像这样的查询。
如果我
理解正确,您不想在值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 == 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();
}