在MongoDB中进行乘法过滤

时间:2016-11-22 17:18:47

标签: c# mongodb linq filtering

我的表中包含HTML中的记录和许多按属性的过滤选项。用户可以选择一个,一个或多个。我在C#中使用mongoDb数据库和MongoDb驱动程序。我怎么能实现这种过滤?

过滤

public class ConsultantFiltersModel
{
    public string RecruiterName { get; set; }
    public int? RecruiterCode { get; set; }
    public bool? WithouRecruiter { get; set; }
    public string FutureWorkerName { get; set; }
    public string PhoneNumber { get; set; }
}

我从客户端传递此过滤器,一些属性为Nullable。我只需要通过非空属性来过滤记录。

我试图像这样认识到

public Consultant FilterRecords(ConsultantFiltersModel consultantFiltersModel)
{        
    return consultantsCollection
        .AsQueryable()
        .Where(recruiterNameFilter =>
         string.IsNullOrEmpty(consultantFiltersModel.RecruiterName) 
         ? true 
         : recruiterNameFilter.Recruiter.Value == consultantFiltersModel.RecruiterName)

         .Where(recruiterCodeFilter => 
         consultantFiltersModel.RecruiterCode.HasValue 
         ? true 
         : recruiterCodeFilter.Recruiter.Key == consultantFiltersModel.RecruiterCode)

         .Where(phoneNumberFilter => 
         string.IsNullOrEmpty(consultantFiltersModel.PhoneNumber)
         ? true 
         : phoneNumberFilter.FutureWorker.Phone.Contains(consultantFiltersModel.PhoneNumber))

         .Where(futureWorkerNameFilter =>
         string.IsNullOrEmpty(consultantFiltersModel.FutureWorkerName) 
         ? true 
         : futureWorkerNameFilter.FutureWorker.Name.Contains(consultantFiltersModel.FutureWorkerName))

        .FirstOrDefault();            
}

但是我得到了这个例外

  

类型' System.Reflection.TargetException'的例外情况发生在   System.Private.CoreLib.ni.dll但未在用户代码中处理
  附加信息:非静态方法需要目标。

也许mongoDbDriver不支持它?有什么建议吗?

1 个答案:

答案 0 :(得分:1)

使用本地mongodb Find()或者直接使用Lambda,或者使用Builders来创建过滤器,你可能会更幸运。它们可能比上面的查询更容易动态构建

var builder = Builders<YourObject>.Filter;
var filter = builder.Eq(x => x.YourField, "SomeValue");
var andFilter = builder.And(filter, builder.Eq(x => .SomeOtherField, "SomeOtherValue"));
var results = consultantsCollection.Find(andFilter).FirstOrDefault();

构建器有许多扩展方法供您过滤,如上所示,我使用的是.Eq()和.And(),但是要探索它,你会找到一个可以帮助你的密集列表