簡體   English   中英

使用 C# Mongodb 驅動程序在嵌套列表中查找項目

[英]Find items in nested list using C# Mongodb driver

我有一個這樣的模型:

Class1 
{
    public List<Class2> Class2List { get; set; }
}

Class2 
{
    public List<Class3> Class3List { get; set; }
}

Class3 
{
    public List<Class4> Class4List { get; set; }
}

Class4 
{
    public int Value { get; set; }
    public DateTime CreateDate{ get; set; }
}

我需要找到兩個日期之間的 Class4 項目列表。 我嘗試使用下面的代碼,但我需要返回 Class4 類型的列表:

public async Task<IList<Class1>> GetClass4BetweenDates(string Id, DateTime fromDate, DateTime toDate)
{
    var builder = Builders<Class1>.Filter;
    var filter = builder.Eq("Id", Id) & builder.Gte("Class2.Class3.Class4.CreateDate", fromDate) & builder.Lte("Class2.Class3.Class4.CreateDate", toDate);
    return await _context.GetCollection<Class1>().Find(filter).ToListAsync();            
}

我知道這是錯誤的。 我需要知道正確的方法

我認為你應該試試這個:

唯一的問題是在您的示例中,您只給出了一個創建日期,女巫元素應該大於然后小於 CreateDate。 這有點不可能。

public async Task<IList<Class1>> GetClass4BetweenDates(string id, DateTime fromDate, DateTime toDate)
{
    var filterDefinition = Builders<Class1>.Filter.Where(x => x.Id == id &&
                                                              x.Class2List.Any(a => a.Class3List.Any(b => b.Class4List.Any(c => c.CreateDate >= fromDate && 
                                                                                                                                c.CreateDate <= toDate))));
    return await _context.GetCollection<Class1>().Find(filterDefinition).ToListAsync();            
}

對於僅返回 class4 類型的后續問題,您可以執行以下操作:

public async Task<IList<Class4>> GetClass4BetweenDates(string id, DateTime fromDate, DateTime toDate)
{
    var filterDefinition = Builders<Class1>.Filter.Where(x => x.Id == id &&
                                                              x.Class2List.Any(a => a.Class3List.Any(b => b.Class4List.Any(c => c.CreateDate >= fromDate && 
                                                                                                                                c.CreateDate <= toDate))));
    var class1 = await _context.GetCollection<Class1>().Find(filterDefinition).ToListAsync();  

    var class4List = new List<Class4>();

    if (class1 == null)
        return class4List; 

    foreach (var class2 in class1.Class2List)
    {
        foreach (var class3 in class2.Class3List)
        {
            if (class3.Class4List.Any())
                class4List.AddRange(class3.Class4List);
        }
    }

    return class4List;       
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM