我在C#中使用以下代码来匹配字段:
var match = new BsonDocument
{
{
"$match",
new BsonDocument
{
{ "Country", paramsEntity.Country },
{ "Company_ID", String.IsNullOrEmpty(paramsEntity.CompanyID) ? "$Company_ID" : paramsEntity.CompanyID },
{ "Staff_ID", String.IsNullOrEmpty(paramsEntity.StaffID) ? "$Staff_ID" : paramsEntity.StaffID }
}
}
};
它什么也没归我。但是当我从$ match中取出Company_ID时,它会给我结果。我的Company_ID过滤有问题吗?
答案 0 :(得分:1)
可能有更好的方法,但你可以这样做:
var query = collection.AsQueryable().Where(e => e.Country == paramsEntity.Country);
if (!string.IsNullOrEmpty(paramsEntity.CompanyId))
{
query = query.Where(e => e.CompanyId == paramsEntity.CompanyId);
}
if (!string.IsNullOrEmpty(paramsEntity.StaffId))
{
query = query.Where(e => e.StaffId == paramsEntity.StaffId);
}
它使用IQueryable接口,并在查询中附加过滤器(如果已指定)。
或者,你可以这样做:
var filterBuilder = Builders<yourObjectType>.Filter;
var filters = new List<FilterDefinition<yourObjectType>>();
filters.Add(filterBuilder.Eq(o => o.Country, paramsEntity.Country));
if (!string.IsNullOrEmpty(paramsEntity.CompanyId))
{
filters.Add(filterBuilder.Eq(o => o.CompanyId, paramsEntity.CompanyId));
}
if (!string.IsNullOrEmpty(paramsEntity.StaffId))
{
filters.Add(filterBuilder.Eq(o => o.StaffId, paramsEntity.StaffId));
}
var dataCursor = collection.Find(filterBuilder.And(filters));
它编译条件列表,然后将它们组合在一起以产生结果。
答案 1 :(得分:0)
这是我的另一种方式。希望与其他人分享:
dynamic param = new JObject();
if (!String.IsNullOrEmpty(paramsEntity.Country))
{
param.Country = paramsEntity.Country;
}
if (!String.IsNullOrEmpty(paramsEntity.CompanyID))
{
param.Company_ID = paramsEntity.CompanyID;
}
if (!String.IsNullOrEmpty(paramsEntity.StaffID))
{
param.Staff_ID = paramsEntity.StaffID;
}
if (!String.IsNullOrEmpty(paramsEntity.BranchID))
{
param.Branch_ID = paramsEntity.BranchID;
}
var match = new BsonDocument
{
{ "$match",
new BsonDocument { BsonSerializer.Deserialize<BsonDocument>(JsonConvert.SerializeObject(param))
}
};