草庐IT

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

coder 2023-05-05 原文

我有一个 MongoDB 集合。这是源数据的网格 (excel) View 。

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

这是我迄今为止尝试过的:

var list1 = collection.AsQueryable();
var list2 = collection.AsQueryable();
var docs = list1.Where(c => list2.Any(a => a.Sedol == c.FSTicker));

还有这个:

var docs = collection.AsQueryable()
        .Where(c => c.FSTicker.Contains(c.Sedol));

每次,我都会收到以下错误:

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()

以防万一,这是我的课:

[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; }
}

我应该对 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"
        }
    ]
    

最佳答案

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

Datapull 类为此获得了额外的字段:

public bool IsTrue { get; set; }

下面的 C# 聚合框架片段

        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();

编辑

这里的问题是基于事实,mongo 本身没有方法来比较相同文档上的字段,这对于来自 SQL 世界的人们来说是很自然的。

Mongo 有一个 $where 子句 - 它是一个 javascript 注入(inject),我们可以传递这样一个片段来操作我们数据集中返回的每个文档,但是 linq 查询不会被翻译为使用它。

这里有一张 JIRA 票:jira

编辑 2

请从 repo 下载示例 - 那里可能缺少某些东西 下面是工作解决方案的屏幕截图

Git 存储库 here

欢迎评论!

关于c# - LINQ-to-MongoDB - 仅当 2 列之间的值匹配时返回列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38258074/

有关c# - LINQ-to-MongoDB - 仅当 2 列之间的值匹配时返回列表的更多相关文章

  1. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  2. ruby 正则表达式 - 如何替换字符串中匹配项的第 n 个实例 - 2

    在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg

  3. ruby - 匹配未转义的平衡定界符对 - 2

    如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。

  4. ruby-on-rails - rails : save file from URL and save it to Amazon S3 - 2

    从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex

  5. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  6. ruby - RVM 使用列表[0] - 2

    是否有类似“RVMuse1”或“RVMuselist[0]”之类的内容而不是键入整个版本号。在任何时候,我们都会看到一个可能包含5个或更多ruby的列表,我们可以轻松地键入一个数字而不是X.X.X。这也有助于rvmgemset。 最佳答案 这在RVM2.0中是可能的=>https://docs.google.com/document/d/1xW9GeEpLOWPcddDg_hOPvK4oeLxJmU3Q5FiCNT7nTAc/edit?usp=sharing-知道链接的任何人都可以发表评论

  7. ruby-on-rails - rails : How to make a form post to another controller action - 2

    我知道您通常应该在Rails中使用新建/创建和编辑/更新之间的链接,但我有一个情况需要其他东西。无论如何我可以实现同样的连接吗?我有一个模型表单,我希望它发布数据(类似于新View如何发布到创建操作)。这是我的表格prohibitedthisjobfrombeingsaved: 最佳答案 使用:url选项。=form_for@job,:url=>company_path,:html=>{:method=>:post/:put} 关于ruby-on-rails-rails:Howtomak

  8. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  9. ruby-on-rails - link_to 不显示任何 rails - 2

    我试图在索引页中创建一个超链接,但它没有显示,也没有给出任何错误。这是我的index.html.erb代码。ListingarticlesTitleTextssss我检查了我的路线,我认为它们也没有问题。PrefixVerbURIPatternController#Actionwelcome_indexGET/welcome/index(.:format)welcome#indexarticlesGET/articles(.:format)articles#indexPOST/articles(.:format)articles#createnew_articleGET/article

  10. ruby - 无法覆盖 irb 中的 to_s - 2

    我在pry中定义了一个函数:to_s,但我无法调用它。这个方法去哪里了,怎么调用?pry(main)>defto_spry(main)*'hello'pry(main)*endpry(main)>to_s=>"main"我的ruby版本是2.1.2看了一些答案和搜索后,我认为我得到了正确的答案:这个方法用在什么地方?在irb或pry中定义方法时,会转到Object.instance_methods[1]pry(main)>defto_s[1]pry(main)*'hello'[1]pry(main)*end=>:to_s[2]pry(main)>defhello[2]pry(main)

随机推荐