【问题标题】:Querying Mongo when a document have one to many relationship in a single well structed query using mongo C# driver当文档在使用 mongo C# 驱动程序的单个结构良好的查询中具有一对多关系时查询 Mongo
【发布时间】:2021-08-01 07:30:46
【问题描述】:

我会尽量简单地解释一下。

我们有这 5 个非常简单的类。任何不以 DTO 后缀结尾的类都表示存在于 mongo 集合中的真实文档。

public class TruckSingleDriver
{
    public string Id { get; set; }
    public string DriverId { get; set; }
}

public class TruckSingleDriverDTO
{
    public string Id { get; set; }
    public Driver Driver { get; set; }
}


public class TruckManyDrivers
{
    public string Id { get; set; }
    public IEnumerable<string> DriversIds { get; set; }
}

public class TruckManyDriversDTO
{
    public string Id { get; set; }
    public IEnumerable<Driver> Drivers { get; set; }
}

public class Driver
{
    public string Id { get; set; }
}

使用 one 查询获取 TruckSingleDriverDTO 的最简单方法如下:

public TruckSingleDriverDTO GetTruckSingleDriverDTO(string truckId)
{
    var truckCollection = mongo.GetDatabase("mydb").GetCollection<TruckSingleDriver>("Trucks");
    var driverCollection = mongo.GetDatabase("mydb").GetCollection<Driver>("Drivers");

    TruckSingleDriverDTO truckDTO = truckCollection.AsQueryable()
                                    .Where(truck => truck.Id == truckId)
                                    .Join(driverCollection, truck => truck.DriverId, driver => driver.Id,
                                          (truck, driver) => new { Id = truck.Id, Driver = driver })
                                    .ToEnumerable() //needed although it seems not
                                    .Select(res => new TruckSingleDriverDTO() { Id = res.Id, Driver = res.Driver })
                                    .Single();
    return truckDTO;
}

我想要实现的是在 single 查询中获取 TruckManyDriversDTO,有没有办法做到这一点?

public TruckManyDriversDTO GetTruckManyDriversDTO(string truckId)
{
    var trucks = mongo.GetDatabase("mydb").GetCollection<TruckManyDrivers>("Trucks");
    var drivers = mongo.GetDatabase("mydb").GetCollection<Driver>("Drivers");

    /*
     * here i need your help 
     * keep in mind that i want it in a single query 
     * below this, ill show the simple way to achieve it with 2 queries
     */

    TruckManyDrivers truck = trucks.Find(t => t.Id == truckId).Single();
    IEnumerable<Driver> driverList = drivers.Find(d => truck.DriversIds.Contains(d.Id)).ToEnumerable();

    return new TruckManyDriversDTO() { Id = truck.Id, Drivers = driverList };
}

【问题讨论】:

    标签: c# mongodb linq mongodb-query


    【解决方案1】:

    我从这个网站得到了帮助:https://www.csharpschool.com/blog/linq-join

    我能想到的最佳解决方案:

        public TruckManyDriversDTO GetTruckManyDriversDTO(string truckId)
        {
            var Trucks = mongo.GetDatabase("mydb").GetCollection<TruckManyDrivers>("Trucks").AsQueryable();
            var Drivers = mongo.GetDatabase("mydb").GetCollection<Driver>("Drivers").AsQueryable();
    
            var query = from truck in Trucks where truck.Id == truckId
                        let truckDrivers = from driver in Drivers
                                           where truck.DriversIds.Contains(driver.Id) select driver
                                           select new { Truck = truck, Drivers = truckDrivers };
    
            TruckManyDriversDTO dto = query.Select(a => new TruckManyDriversDTO() { Id = a.Truck.Id, Drivers = a.Drivers } ).Single();
    
            return dto;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-01
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      • 2012-11-17
      • 1970-01-01
      • 2015-03-10
      相关资源
      最近更新 更多