在 Linq 和 C# 中使用 AND/OR 选项创建搜索方法

本文关键字:OR 选项 创建 方法 搜索 AND Linq | 更新日期: 2023-09-27 18:31:31

我正在尝试创建一些方法,用于使用 c# 和 asp.net mvc 4 (linq) 在 databese 中搜索和过滤数据

public ActionResult Search_Names_Using_Location(string b,string d, int c=0,int Id=0)
{
    ViewBag.Locations = db.Locations.ToList();
    var agentlocation = new AgentLocationViewModel();
    agentlocation.agents = new List<Agent>();          
    agentlocation.agents = (from a in db.Agents
                            where a.LocationId == Id
                            && (a.LocationName == b)
                            && (a.age > c )
                            select a).ToList();
    return View(agentlocation);
}

问题是用户可以让一些 texbox 为空,因此 Id 或 a 或 b 的值可以为 null,因此查询将一无所获。

他们有什么建议吗(如果有的话,我可以去,但如果我有 7 或 8 个字符串,那就很难了)?

在 Linq 和 C# 中使用 AND/OR 选项创建搜索方法

您可以在查询中检查null

public ActionResult Search_Names_Using_Location(string b,string d,
            int c=0,int Id=0,)
    {
        ViewBag.Locations = db.Locations.ToList();
        var agentlocation = new AgentLocationViewModel();
        agentlocation.agents = new List<Agent>();
        var noId = string.IsNullOrWhitespace(Id);
        var noB = string.IsNullOrWhitespace(b);
            agentlocation.agents = (from a in db.Agents
                                    where (noId  || a.LocationId == Id)
                                    && (noB  || a.LocationName == b)
                                    && (a.age > c )
                                    select a).ToList();

        return View(agentlocation);
    }

如果你有 AND 条件,只有你可以使用

var query = db.Agents;
if (Id != 0) 
{ 
   query = query.Where(x => x.LocationId == Id)
}
if (!string.IsNullOrWhitespace(b))
{
   query = query.Where(x => x.LocationName == b)
}
...

变量结果 = 查询。ToList();实际数据库调用

这将消除无用的empty条件,例如WHERE (0 = 0 OR LocationId = 0)

如果是OR条件和组合,你可以看看PredicateBuilder因此,您可以使用 Or 和 And 谓词组合,如下所示:

IQueryable<Product> SearchProducts (params string[] keywords)
{
  var predicate = PredicateBuilder.False<Product>();
  foreach (string keyword in keywords)
  {
    string temp = keyword;
    predicate = predicate.Or (p => p.Description.Contains (temp));
  }
  return dataContext.Products.Where (predicate);
}