我有一个要求,当我们传递多个参数时,我需要获取匹配的记录。例如,如果我有四个来自API的参数,但假设用户仅传递了两个参数,其余两个则为null。在那种情况下,我需要查找与那些非空参数匹配的记录。如果用户传递所有参数,那么在那种情况下,我必须获取与所有四个参数匹配的所有记录。
我是mongo新手
答案 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();
}