多个位置在 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
}

这是最好的方法还是其他可能的事情。 提前

多个位置在 LINQ 中基于参数值

很多很多建议。

像这样的东西?

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