如何使用多参数.net core + mongodb查找任何匹配的记录

时间:2019-02-09 04:02:59

标签: mongodb .net-core

我有一个要求,当我们传递多个参数时,我需要获取匹配的记录。例如,如果我有四个来自API的参数,但假设用户仅传递了两个参数,其余两个则为null。在那种情况下,我需要查找与那些非空参数匹配的记录。如果用户传递所有参数,那么在那种情况下,我必须获取与所有四个参数匹配的所有记录。

我是mongo新手

1 个答案:

答案 0 :(得分:1)

您可以轻松构建如下查询:

public IEnumerable<MyType> GetFiltered(string p1, string p2, string p3, string p4)
{
  return collection.Find(item =>
    (p1 == null || item.P1 == p1) &&
    (p2 == null || item.P2 == p2) &&
    (p3 == null || item.P3 == p3) &&
    (p4 == null || item.P4 == p4)
  ).ToList();
}

或使用IQueryable接口逐步操作:

public IEnumerable<MyType> GetFiltered(string p1, string p2, string p3, string p4)
{
  var items = collection.AsQueryable();

  if (p1 != null)
    items = items.Where(x => x.P1 == p1);

  if (p2 != null)
    items = items.Where(x => x.P2 == p2);

  if (p3 != null)
    items = items.Where(x => x.P3 == p3);

  if (p4 != null)
    items = items.Where(x => x.P4 == p4);

  return items.ToList();
}

或通过FilterDefinition逐步进行操作:

public IEnumerable<MyType> GetFiltered(string p1, string p2, string p3, string p4)
{
  var builder = Builders<MyType>.Filter;
  List<FilterDefinition<MyType>> conditions = new List<FilterDefinition<MyType>>();

  if (p1 != null)
    conditions.Add(builder.Where(x => x.P1 == p1));

  if (p2 != null)
    conditions.Add(builder.Where(x => x.P2 == p2));

  if (p3 != null)
    conditions.Add(builder.Where(x => x.P3 == p3));

  if (p4 != null)
    conditions.Add(builder.Where(x => x.P4 == p4));

  return collection.Find(builder.And(conditions)).ToList();
}