在 Android 上使用 Aggregate 时 MongoDB LINQ 崩溃

问题描述 投票:0回答:1

我在 Atlas 上有一个 MongoDB 数据库,其中保存了我读过的书籍的详细信息。 有两个集合:一个是作者集合,一个是书籍集合。

[BsonIgnoreExtraElements]
public class Author
{
    [BsonId][BsonRepresentation(BsonType.ObjectId)] public ObjectId _id { get; set; }
    [BsonElement("first")] public string? first { get; set; }
    [BsonElement("last")] public string? last { get; set; }
    [BsonElement("author_id")] public BsonInt32? author_id { get; set; }
    [BsonElement("FullName")][BsonIgnoreIfNull] public string? FullName { get; set; }

}

[BsonIgnoreExtraElements]
public class Book
{
    [BsonId][BsonRepresentation(BsonType.ObjectId)] public ObjectId _id { get; set; }
    [BsonElement("title")] public string? title { get; set; }
    [BsonElement("title_id")] public BsonInt32? title_id { get; set; }
    [BsonElement("author")] public string? author { get; set; }
    [BsonElement("issue_date")] public string? issue_date { get; set; }
    [BsonElement("return_date")] public string? return_date { get; set; }
}

有 485 位作者和 1452 本书。该数据库提供使用 MAUI 创建的 Android 应用程序的数据。 其中一页提供了数据库中拥有最多书籍的作者的列表。 这使用 LINQ 组查询。

public async Task<List<Popular>> GetPopular()
{
    IMongoQueryable<Popular>? query = (from book in booksCollection.AsQueryable()
                                       group book by book.author into g
                                       let lastBook = g.OrderByDescending(b => b.return_date).FirstOrDefault()
                                       select new Popular
                                       {
                                           Author = g.Key,
                                           Count = g.Count(),
                                           ReturnDate = lastBook.return_date,
                                           Title = lastBook.title
                                       }).OrderByDescending(g => g.Count).ThenBy(g => g.Author).Take(10);
    List<Popular>? popular = await query.ToListAsync();
    return popular;
}

很多时候它会正确运行并生成列表。 但是,它确实会随机在 query.ToListAsync 语句上崩溃。

**MongoDB.Driver.Linq.Linq3Implementation.Ast.Optimizers.AstGroupingPipelineOptimizer+UnableToRemoveReferenceToElementsException:**
 'Exception of type 'MongoDB.Driver.Linq.Linq3Implementation.Ast.Optimizers.AstGroupingPipelineOptimizer+UnableToRemoveReferenceToElementsException' was thrown.'

我使用 Visual Studio 17.11.4 和 MongoDB.Driver 2.9,默认使用 LINQ 3。 有没有一种简单的方法可以将查询转换为使用 Builders 或 BsonDocument,或者我使用的 LINQ 中是否有错误?

c# android mongodb linq
1个回答
0
投票

我在 Studio3T(3T Software Labs Ltd https://studio3t.com)的帮助下解决了这个问题。 这是一款用于构建 MongoDB 查询的优秀产品,具有免费版和专业版。 我已将链接替换为不会崩溃的 BsonDocument 查询!

© www.soinside.com 2019 - 2024. All rights reserved.