LINQ-to-MongoDB - 仅当2列之间的值匹配时返回列表

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查询以使其工作?

附加信息:

  • MongoDB版本:3.0.4
  • C#驱动程序:2.2.4
  • 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)

pro*_*r79 5

当我们需要比较同一文档中的两个字段时,这会探讨一个问题,请找到使用聚合框架的代码段.

这个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 在这里

结果

欢迎任何评论!


inq*_*one 0

以下答案归功于@Ciro Corvino:

var docs = collection.AsEnumerable().Where(c => c.FSTicker.Equals(c.Sedol));
Run Code Online (Sandbox Code Playgroud)