C#有条件$匹配

时间:2017-11-10 05:53:10

标签: c# mongodb

我在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过滤有问题吗?

2 个答案:

答案 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))
                }
            };