C#linq查找列表中的所有字符串值在mongodb中匹配

时间:2016-10-31 05:21:23

标签: c# mongodb linq

我的问题可能不是特定于MongoDb,即使我正在使用它。

我想查找列表中包含的所有记录

以前我可以搜索OrderNumber Collection.Find string orderNumber

的传入参数

因此,方法collection.find看起来像这样:

IEnumerable<Activity> activity = Collection.Find<Activity>(o => o.OrderNumber == orderNumber).ToList();

但是,现在我想找到List

所以我需要将此语句修改为要查​​找的LOOP,还是可以将其修改为Find列表中的所有记录?

public static IEnumerable<Activity> GetActivitiesByOrderNumber(List<OrderStuff> orderNumber)
{

     IEnumerable<Activity> activity = Collection.Find<Activity>(o => o.OrderNumber == orderNumber).ToList();
     return activity;
}

更新

Error CS1503 Argument 1: cannot convert from 'JobManager.Models.Activity' to 'JobManager.Controllers.APIs.OrderStuff'

public static IEnumerable<Activity> GetActivitiesByOrderNumber(List<OrderStuff> orderNumber)
{
    IEnumerable<Activity> activity = Collection.Find<Activity>(o => orderNumber.Contains(o)).ToList();
    return activity;
}

活动类

public class Activity
{

    [BsonId]
    [BsonRepresentation(BsonType.ObjectId)]
    public string Id { get; set; }
    public DateTime? CreatedDate { get; set; }
    public int CreatedById { get; set; }
    public string CreatedByName { get; set; }

    // ..... etc..
 }

OrderStuff类

public class OrderStuff
{
    public string id { get; set; }
}

2 个答案:

答案 0 :(得分:0)

试试这个:

public static IEnumerable<Activity> GetActivitiesByOrderNumber(List<Activity> activities)
{
     IEnumerable<Activity> activity = Collection.Find<Activity>(o => activities.Contain(o)).ToList();
     return activity;
}

答案 1 :(得分:0)

查看以下工作版本,我已经采取一些自由来更改对象名称以正确表示集合。

public static IEnumerable<Activity> GetActivitiesByOrderNumber(List<OrderStuff> orderNumbers)
{
   List<string> OrderStuffIds = orderNumbers.Select(o => o.Id);

    IEnumerable<Activity> activities = Collection.Where(a => OrderStuffIds.Contains(a.Id)).ToList();
    return activity;
}

<强>解释

  

为什么原始代码不起作用?

您正在将OrderStuffActivity进行比较,当两者之间没有明显的关系时,您需要使用Id字段进行比较

  

需要修改

  • OrderStuff列表
  • 中获取Id列表
  • 通过比较Ids
  • ,在获取Activity列表时使用相同的内容进行比较
  

其他问题:

  • 即使是当前的解决方案也是O(N ^ 2)实施
  • 可以通过将List<OrderStuff>转换为Hashset<OrderStuff>来进一步改进,这将在O(LogN)时间内进行二进制搜索,而不是O(N)
  • 类似的东西:

    HashSet<OrderStuff> orderNumberHashSet = new HashSet<OrderStuff>(orderNumbers);