linq基于参数值

时间:2016-02-04 13:43:37

标签: c# asp.net-mvc linq

我想在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
}

这是做到这一点的最佳方式还是其他可能的方法。如果有任何建议,请提前许多人。

3 个答案:

答案 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,则只返回匹配的元素。