C# 基于搜索使用C驱动程序获取MongoDB集合的子集合

C# 基于搜索使用C驱动程序获取MongoDB集合的子集合,c#,mongodb,C#,Mongodb,我有这个项目 我有以下几个类,其中playerrakhistory保存在MongoDB中,其中包含playerrakhistoryseasontry的列表,每个列表都包含playerrakhistoryplot 然后,我想提供一封球员的电子邮件和一个赛季名称,然后只将PlayerHistoryPlots列表作为一个列表输出,但是我编写的代码非常慢,而且不比只提供一封电子邮件和获取更多数据快 顺便说一下,我不知道如何编写它以使其异步 我现在的问题是 public async Task<Lis

我有这个项目

我有以下几个类,其中playerrakhistory保存在MongoDB中,其中包含playerrakhistoryseasontry的列表,每个列表都包含playerrakhistoryplot

然后,我想提供一封球员的电子邮件和一个赛季名称,然后只将PlayerHistoryPlots列表作为一个列表输出,但是我编写的代码非常慢,而且不比只提供一封电子邮件和获取更多数据快

顺便说一下,我不知道如何编写它以使其异步

我现在的问题是

public async Task<List<PlayerRankHistoryPlot>> GetPlayerRankEntries(string email, string seasonName)
{
    var query = Collection.AsQueryable().SingleOrDefault(x => x.Email == email)
        .PlayerRankHistorySeasonEntries.SingleOrDefault(x => x.SeasonName == seasonName).HistoryPlots;
    List<PlayerRankHistoryPlot> result = query.ToList();
    return result;
}


public class PlayerRankHistory
{
    public PlayerRankHistory(string email)
    {
        Email = email;
        PlayerRankHistorySeasonEntries = new List<PlayerRankHistorySeasonEntry>();
    }

    public Guid Id { get; set; }
    public string Email { get; set; }
    public List<PlayerRankHistorySeasonEntry> PlayerRankHistorySeasonEntries { get; set; }
}

public class PlayerRankHistorySeasonEntry
{
    public PlayerRankHistorySeasonEntry(string seasonName)
    {
        SeasonName = seasonName;
        HistoryPlots = new List<PlayerRankHistoryPlot>();
    }

    public string SeasonName { get; set; }
    public List<PlayerRankHistoryPlot> HistoryPlots { get; set; }
}

public class PlayerRankHistoryPlot
{
    public PlayerRankHistoryPlot(DateTime date, int rank, int eloRating)
    {
        Date = date;
        Rank = rank;
        EloRating = eloRating;
    }

    public DateTime Date { get; set; }
    public int Rank { get; set; }
    public int EloRating { get; set; }
}
我相信,当您定义Collection.AsQueryable.FirstOrDefault时,您正在提取该集合中的所有记录,然后对它们进行过滤。您应该使用MongoDB C驱动程序提供的Find方法来过滤记录,这也要快得多

根据电子邮件地址获取PlayerAnkhistory对象 从筛选的记录中,仅返回具有所需季节的记录 仅获取第一个匹配项列表的HostyPlots
是的,我想它能把所有东西都拿来。如果select似乎不起作用,我得到的“IFindFluent”不包含“select”的定义,并且没有可访问的扩展方法“select”接受类型为“IFindFluent”的第一个参数
{"_id":"AYU3e3Qgw0Gut1fngze80g==","Email":"someemail@gmail.com","PlayerRankHistorySeasonEntries":[{"SeasonName":"Season 1","HistoryPlots":[{"Date":"2020-01-10T12:24:12.511Z","Rank":11,"EloRating":1488},{"Date":"2020-01-13T12:51:41.597Z","Rank":12,"EloRating":1488},{"Date":"2020-01-15T11:11:43.223Z","Rank":10,"EloRating":1510},{"Date":"2020-01-15T11:11:45.049Z","Rank":8,"EloRating":1530},{"Date":"2020-01-15T12:14:58.042Z","Rank":9,"EloRating":1530},{"Date":"2020-01-15T12:14:59.886Z","Rank":8,"EloRating":1530}]}]}
Collection.Find(Builders<PlayerRankHistory>.Filter.Eq(x => x.Email, email))
            .Select(y => y.PlayerRankHistorySeasonEntries.Where(z => z.SeasonName.Equals(seasonName)))
            .FirstOrDefault()?.HistoryPlots
            .ToList();