【问题标题】:Mongodb, linq driver. How to construct Contains with variable or statementsMongodb,linq 驱动程序。如何使用变量或语句构造包含
【发布时间】:2012-06-06 22:07:30
【问题描述】:

我正在使用 C# 的 Mongo LINQ 驱动程序,效果很好。

对很多属性进行排序,但这是一个我无法解决的问题,它可能很简单。

var identifierList = new []{"10", "20", "30"};
var newList = list.Where(x => identifierList.Contains(x.Identifier));

This is NOT supported ... 

所以我可以这样做:

 var newList = list.Where(x => x.Identifier == "10" || x.Identifier == "20" || x.Identifier == "30");

但是由于列表是可变的……我该如何构造上面的内容?还是有更好的选择?

list 的类型是 IQueryable<MyCustomClass>

有关信息...这被用作许多属性的过滤器。在 SQL 中,我可以有一个父 -> 子关系。但由于我不能作为主 ID 的父级,我需要取出所有 ID,然后像这样构造它。

希望这是有道理的。如果需要,我会解释更多。

【问题讨论】:

  • 你想做什么?查找列表是否包含另一个列表中的所有项目?您上面的代码(修复后)将使 newList 上的项目与列表中的项目相同
  • Ups,示例中的错误,将解决这个问题:-)
  • 还是……不清楚。尝试用简单的语言解释您要通过两个列表操作实现的目标。例如:我想将 identifierList 复制到 newList (我可以从上面的代码中假设)
  • 添加了更多信息。也许应该明确指出第一个 list 是复杂元素(类而不是字符串),因此是 Identifier 属性。

标签: c# .net linq mongodb mongodb-.net-driver


【解决方案1】:

回答我自己的问题...... Mongo Sharp LINQ 驱动程序有一个名为“In”的扩展方法,它完全符合我的需要。

然而,他们在 1.5 中实现了它,所以我们可以使用旧的方式,例如:https://jira.mongodb.org/browse/CSHARP-462

 var list = new []{"10", "10"};

 search.Where(x => list.Contains(x.Id));

但是 1.5 版本的包还没有在 nuget 上。

但是,这应该与 mongo-csharp-driver 带来的特别惊喜的“In”扩展一起使用。

 search.Where(x => x.In(list));

【讨论】:

  • 您的初始声明应该有效。它根本没有在 1.4.2 中实现。 1.5 将包含此功能。 jira.mongodb.org/browse/CSHARP-462
  • 是的,它应该可以工作,但由于我使用的是 1.4.2 而不是 1.5,所以我将不得不使用最后一个。我在 LINQ 提供程序中发现的大多数问题都已得到修复 :-)。我确实希望他们会开始预发布 :-)。
【解决方案2】:
var identifierList = new []{"10", "20", "30"};
var newList = list.ToList().Where(x => identifierList.Contains(x.Identifier));

您只需要使用 List 而不是 Ienumerable(通过使用 .ToList() 来做到这一点)

如果不起作用,请添加您的列表类型

【讨论】:

  • 我正在尝试过滤列表。就像摆脱 IQueryable 中没有将 Identifier 属性设置为“10”、“20”或“30”的所有 MyCustomClass。
  • 不支持 where 子句:Enumerable.Contains(String[]:{ "10", "20", "30" }, x.Identifier)。
  • 你能添加你的列表初始化和声明吗?
  • 它的mongodb-csharp驱动不支持“包含”。我通过在 Where 子句中构造一个简单的变量列表来寻找解决方案。
  • 嗯......可以做到这一点。但是从 Mongo 获取 100.000 行似乎不是一个可靠的解决方案,但我同意,它会起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多