inq*_*one 6 c# linq mongodb c#-4.0 mongodb-.net-driver
我有一个MongoDB集合.这是源数据的网格(excel)视图.

如果"fstick"列中的值与同一集合中"sedol"列的值匹配,我只想返回一个列表.最后,我想要这个:

这是我到目前为止所尝试的:
var list1 = collection.AsQueryable();
var list2 = collection.AsQueryable();
var docs = list1.Where(c => list2.Any(a => a.Sedol == c.FSTicker));
Run Code Online (Sandbox Code Playgroud)
还有这个:
var docs = collection.AsQueryable()
.Where(c => c.FSTicker.Contains(c.Sedol));
Run Code Online (Sandbox Code Playgroud)
每次,我都会收到以下错误:
System.ArgumentException: Unsupported filter: {document}{fstick}.Contains({document}{sedol}).
at MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate(Expression node)
at MongoDB.Driver.Linq.Translators.PredicateTranslator.Translate(Expression node, IBsonSerializerRegistry serializerRegistry)
at MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslateWhere(WhereExpression node)
at MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(Expression node)
at MongoDB.Driver.Linq.Translators.QueryableTranslator.TranslatePipeline(PipelineExpression node)
at MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(Expression node)
at MongoDB.Driver.Linq.Translators.QueryableTranslator.Translate(Expression node, IBsonSerializerRegistry serializerRegistry)
at MongoDB.Driver.Linq.MongoQueryProviderImpl`1.Translate(Expression expression)
at MongoDB.Driver.Linq.MongoQueryProviderImpl`1.Execute(Expression expression)
at MongoDB.Driver.Linq.MongoQueryableImpl`2.GetEnumerator()
Run Code Online (Sandbox Code Playgroud)
以防万一,这是我的班级:
[BsonIgnoreExtraElements]
public class Datapull
{
[BsonElement("fstick")]
public string FSTicker { get; set; }
[BsonElement("sedol")]
public string Sedol { get; set; }
[BsonElement("exchange")]
public string Exchange { get; set; }
[BsonElement("localtick")]
public string LocalTicker { get; set; }
[BsonElement("compname")]
public string Company { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我应该更改LINQ查询以使其工作?
附加信息:
Json文档转储(从MongoChef导出并修改)
[{
"fstick" : "25881xx",
"exchange" : "OTC",
"localtick" : "MSFT",
"sedol" : "25881xx",
"compname" : "Microsoft Corporation",
"currency" : "USD",
"closedate" : "2016-07-11"
}, {
"fstick" : "2046xxx",
"exchange" : "NASDQ",
"localtick" : "AAPL",
"sedol" : "2046xxx",
"compname" : "Apple Inc.",
"currency" : "USD",
"closedate" : "2016-07-11"
}, {
"fstick" : "BCBHZxx",
"exchange" : "NASDQ",
"localtick" : "BBRY",
"sedol" : "BCBHZxx",
"compname" : "BlackBerry Limited",
"currency" : "USD",
"closedate" : "2016-07-11"
}, {
"fstick" : "BB-CA",
"exchange" : "TSE",
"localtick" : "BB",
"sedol" : "BCBHZ3x",
"compname" : "BlackBerry Limited",
"currency" : "CAD",
"closedate" : "2016-07-11"
}
]
Run Code Online (Sandbox Code Playgroud)当我们需要比较同一文档中的两个字段时,这会探讨一个问题,请找到使用聚合框架的代码段.
这个Datapull班有额外的领域:
public bool IsTrue { get; set; }
Run Code Online (Sandbox Code Playgroud)
下面的C#Aggregation Framework片段
var data = collection.Aggregate();
var a1 =
data.Project(
x =>
new
{
FSTicker = x.FSTicker,
Sedol = x.Sedol,
Company = x.Company,
Exchange = x.Exchange,
LocalTicker = x.LocalTicker,
IsTrue = (x.Sedol == x.FSTicker)
});
var a2 = a1.Match(x => x.IsTrue);
var result = a2.ToList();
Run Code Online (Sandbox Code Playgroud)
编辑
这里的问题是基于这样的事实,即mongo本身没有比较相同文档中的字段的方法,对于来自SQL世界的人来说,它是自然的.
Mongo有一个$where子句 - 它是一个javascript注入,我们可以传递这样一个片段来操作我们的dataSet中的每个返回文档,但linq查询不会被翻译为使用它.
这里有一张JIRA票:jira
编辑2
请从repo下载示例 - 可能缺少某些内容下面是工作解决方案的屏幕截图
Git repo 在这里
欢迎任何评论!
以下答案归功于@Ciro Corvino:
var docs = collection.AsEnumerable().Where(c => c.FSTicker.Equals(c.Sedol));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1034 次 |
| 最近记录: |