我的问题可能不是特定于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; }
}
答案 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;
}
<强>解释强>
为什么原始代码不起作用?
您正在将OrderStuff
与Activity
进行比较,当两者之间没有明显的关系时,您需要使用Id
字段进行比较
需要修改
OrderStuff
列表Activity
列表时使用相同的内容进行比较
其他问题:
List<OrderStuff>
转换为Hashset<OrderStuff>
来进一步改进,这将在O(LogN)
时间内进行二进制搜索,而不是O(N)
类似的东西:
HashSet<OrderStuff> orderNumberHashSet = new HashSet<OrderStuff>(orderNumbers);