【问题标题】:C# Query MongoDb using linq and returning valid JsonC# 使用 linq 查询 MongoDb 并返回有效的 Json
【发布时间】:2021-04-22 11:09:25
【问题描述】:

我只是尝试使用 Linq 使用 Core 5 查询 MongoDB。

我的集合包含许多不同的文档架构,所以我无法创建一个类来映射。

我最终只想从查询中获得有效的 Json 输出。

这是我所拥有的:

public async Task<object> GetChapters()
{
    var client = new MongoClient();
    var db = client.GetDatabase("test");
    var collection = db.GetCollection<BsonDocument>("test"); <-- this is a problem as my collection 
                                                                 doesn't have a .Net class to map to

    return await collection.AsQueryable()
        .Where(x => x.ChapterName == "SouthEast Chapter")  <-- of course this fails
        .Select(x => x.Values)
        .ToListAsync();
}

我怎样才能正确地做到这一点?

【问题讨论】:

  • 您在第 5 行中强调的确切问题是什么?是编译器错误吗?
  • 它不会抛出异常,但由于我有一个 BsonDocument,我不知道如何执行 .where、.orderBy 等。
  • 我认为您可以使用您在查询过滤器中使用的字段映射到一个类,然后选择您要使用的字段。
  • 问题是我没有适用于所有可能模式的类。我认为这就是它存储 json、任何 json 的 documentDB 的美妙之处
  • 您可以通过BsonDocument 的索引器访问ChapterName。因此,条件将变为:.Where(x =&gt; x["ChapterName"].AsString == "SouthEast Chapter")

标签: c# mongodb linq


【解决方案1】:

你不能,因为 LINQ 不支持动态 - expando 对象。

Dynamic LINQ querying of an ExpandoObject?

MongoDB C#驱动中有很多助手,下面是一些查询BsonDocument的简单方法

using System;
using System.Collections.Generic;
using MongoDB.Bson;
using MongoDB.Driver; // Important to have .ToList() extensions
using MongoDB.Bson.Serialization;

static void Main(string[] args)
{
    var collection = new MongoClient().GetDatabase("mq").GetCollection<BsonDocument>("Event3");
    var bsf = Builders<BsonDocument>.Filter;

    List<FilterDefinition<BsonDocument>> example1 = new List<FilterDefinition<BsonDocument>>();
    example1.Add(bsf.Eq("msg", "master"));
    example1.Add(bsf.Eq("to", "server"));
    var result1 = collection.Find(bsf.And(example1)).ToList();

    FilterDefinition<BsonDocument> example2 = bsf.Empty;
    example2 = bsf.And(example2, bsf.Eq("msg", "master"));
    example2 = bsf.And(example2, bsf.Eq("to", "server"));
    var result2 = collection.Find(example2).ToList();

    // To see how to create json syntax from Filter
    Console.WriteLine(example2.Render(BsonSerializer.SerializerRegistry.GetSerializer<BsonDocument>(), BsonSerializer.SerializerRegistry));
    string example3 = "{ 'msg' : 'master', 'to' : 'server' }";
    var result3 = await collection.Find(BsonDocument.Parse(example3)).ToListAsync();

    dynamic example4 = new ExpandoObject();
    example4.msg = "master"; // Works only for equality
    example4.to = "server";
    var result4 = collection.Find(new BsonDocument(example4)).ToList();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-09
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    相关资源
    最近更新 更多