多个位置在 LINQ 中基于参数值
本文关键字:参数 于参数 位置 LINQ | 更新日期: 2023-09-27 18:33:10
我想在linq中有多个where子句,但其中只有一个应该执行,我正在尝试这样的事情:
public JsonResult GetPost(int? id, int? tagid, DateTime? date)
{
var ret = from data in db.Posts.Include(x => x.Tags)
.Include(x => x.Neighbourhood)
.Where((x => x.NeighbourhoodId == id) || (y => y.PostedDate == date) || third condition).ToList()
但是我无法在那里放置第二个和第三个条件,因为在 Y 之后放置点后,我看不到任何选项。
现在,在这三个参数中,只有一个参数具有值,另外两个参数具有 null,因此,它应该只检查带有值的参数。
我应该这样写查询,正确的方式吗:
if (id != null)
{
//whole query here
}
else if (tagid != null)
{
//whole query here
}
else (date != null)
{
//whole query here
}
这是最好的方法还是其他可能的事情。 提前
像这样的东西?
var ret = from data in db.Posts.Include(x => x.Tags)
.Include(x => x.Neighbourhood)
.Where(x => x.NeighbourhoodId == (id ?? x.NeighbourhoodId) &&
x.<condition> == (tagid ?? x.<condition>) &&
x.PostedDate == (date ?? x.PostedDate).ToList();
或者像这样:
var ret = from data in db.Posts.Include(x => x.Tags)
.Include(x => x.Neighbourhood)
.Where(x => id.HasValue ? x.NeighbourhoodId == id :
tagid.HasValue ? x.<condition> == tagid :
x.PostedDate == date).ToList();
另一种选择是更动态地构建查询。我认为这也使您的代码更具人类可读性,并且如果需要,您的条件可能会更加复杂(例如,在循环中构建查询或其他内容)。您可以将其与任何其他运算符一起使用,例如Include
等。生成查询后,可以调用 ToList()
。
var ret = db.Posts.Include(x => x.Tags).Include(x => x.Neighbourhood);
if (id != null)
{
ret = ret.Where((x => x.NeighbourhoodId == id);
}
else
{
...
}
var result = ret.ToList();
您可以使用以下内容:
var ret = from data in db.Posts.Include(x => x.Tags)
.Include(x => x.Neighbourhood)
.Where(x => id == null || x.NeighbourhoodId == id)
.Where(x => date == null || y.PostedDate == date)
.ToList();
如果参数为 null,则 where 子句返回序列的每个元素。如果它不为 null,则只返回匹配的元素。