我想在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之后放点后,我无法将第二和第三个条件放在那里becoz,我看不到任何选项。
现在,在这三个参数中,只有一个参数具有值,而其他两个参数将为null,因此它应该仅使用值检查参数。
我应该像这样写一个查询,这是正确的方法:
if (id != null)
{
//whole query here
}
else if (tagid != null)
{
//whole query here
}
else (date != null)
{
//whole query here
}
这是做到这一点的最佳方式还是其他可能的方法。如果有任何建议,请提前许多人。
答案 0 :(得分:2)
这样的东西?
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();
答案 1 :(得分:1)
另一种选择是更动态地构建查询。我认为这也使您的代码更具人性化,如果需要,您的条件可能会更复杂(例如,在循环内部构建查询等)。您可以将其与其他任何运算符一起使用,例如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();
答案 2 :(得分:0)
您可以使用以下内容:
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,则只返回匹配的元素。