1

我在https://github.com/MyGitHubTests/MongoNestedTests/tree/master/MongoTest构建了一个小型测试项目

这是我的 JSON 文档示例 github.com/MyGitHubTests/MongoNestedTests/blob/master/MongoTest/MongoTest/TestJSON/MongoTest2.json :

{
  "Cars": [
    {
      "Engine": { "Type": "V8", "Displacement": 4.8 },
      "Body": { "Style": "Targa", "Color": "White" },
      "Drivers": [
        {
          "Name": { "First": "Bob", "Last": "Fast" },
          "Address": { "Street": "Top Ct", "City": "Seattle" },
          "Contact": { "Phone": "(000) 000-0000", "Email": "bob@email.me" }
        }
      ],
      "Trips": [
        {
      "Note" : "Trip F",
          "Mileage": { "Start": 1000, "End": 2000 },
          "Period": { "Start": "2017-12-01T00:00:00", "End": "2017-12-02T00:00:00" },
          "Cargo": [
            {
              "Size": { "Height": 100, "Wight": 200, "Lenght": 300 },
              "Info": { "Weight": 400, "Name": "Cargo Name F1"}
            },
            {
              "Size": { "Height": 500, "Wight": 600, "Lenght": 700 },
              "Info": { "Weight": 800, "Name": "Cargo Name F2"}
            },
            {
              "Size": { "Height": 900, "Wight": 1000, "Lenght": 1100 },
              "Info": { "Weight": 1200, "Name": "Cargo Name F3"}
            }
          ]
    }
      ]
    }
  ]
}

代表 JSON 的 Poco 类在https://github.com/MyGitHubTests/MongoNestedTests/blob/master/MongoTest/MongoTest/Poco.cs上,你可以看到它非常简单直接,除了嵌套对象:

 public class Cargo
    {
        public Size Size { get; set; }
        public Info Info { get; set; }
    }

    public class Trip
    {
        public string Note { get; set; }
        public Mileage Mileage { get; set; }
        public Period Period { get; set; }
        public List<Cargo> Cargo { get; set; }
    }

    public class Car
    {
        public Engine Engine { get; set; }
        public Body Body { get; set; }
        public List<Driver> Drivers { get; set; }
        public List<Trip> Trips { get; set; }
    }

    public class Poco
    {
        public ObjectId Id { get; set; }
        public List<Car> Cars { get; set; }
    }

我正在尝试使用 database.GetCollection().AsQueryable() 来查询数据,它会产生相当奇怪的结果。

这是我的代码 github.com/MyGitHubTests/MongoNestedTests/blob/master/MongoTest/MongoTest/Program.cs

    var collection = database.GetCollection<Poco>("cars");
    var queryable = collection.AsQueryable<Poco>();

    var count = queryable.Count();
    Console.WriteLine("Queryable {0} count: {1}", queryable, count);

    // Working example
    var cars = queryable.Select(a => a.Cars);

    foreach (IList<Car> car in cars)
    {
        Console.WriteLine("car.Count {0}", car.Count);
    }

    // Working example
    var qry = queryable.Select(a => a.Cars.Select(b => b.Engine));

    foreach (IList<Engine> engines in qry)
        foreach (Engine engine in engines)
        {
            Console.WriteLine("Engine Type {0}, Displacement {1}", engine.Type, engine.Displacement);
        }

    // Working example
    var result = from a in queryable
                 from b in a.Cars
                 select b.Engine;

    foreach (Engine engine in result)
    {
        Console.WriteLine("Engine Type {0}, Displacement {1}", engine.Type, engine.Displacement);
    }

    // Working example
    // Note: it's not clear why I have to use List here instead of IList as above
    var drivers = queryable.Select(a => a.Cars.Select(b => b.Drivers));

    foreach (List<List<Driver>> listA in drivers)
        foreach (List<Driver> listB in listA)
            foreach (Driver driver in listB)
            {
                Console.WriteLine("Driver Name: {0}, {1}", driver.Name.First, driver.Name.Last);
            }

    // 'System.NotSupportedException' : {"$project or $group does not support {document}."}
    //var resultDriver = from a in queryable
    //             from b in a.Cars
    //             from c in b.Drivers
    //             select c;
    //foreach (Driver driver in resultDriver)
    //{
    //    Console.WriteLine("Driver Name: {0}, {1}", driver.Name.First, driver.Name.Last);
    //}

    // Working example
    // Note: it's not clear why I have to use IEnumerable here instead of List as above
    var cargoList = queryable.Select(a => a.Cars.Select(b => b.Trips.Select(c => c.Cargo)));

    foreach (List<IEnumerable<List<Cargo>>> listA in cargoList)
        foreach (IEnumerable<List<Cargo>> listB in listA)
            foreach (List<Cargo> listC in listB)
                foreach (Cargo cargo in listC)
                {
                    Console.WriteLine("Cargo Name: {0}, Height: {1}", cargo.Info.Name, cargo.Size.Height);
                }

这是我的问题: 1) 看看最后一个示例,其中返回的 cargoList 类型是List<IEnumerable<List<Cargo>>>- 我无法弄清楚为什么存在 List - IEnumerable - List 的组合,我的类只使用List<>自然而然这就是我所期望的。

2)我可以通过var drivers = queryable.Select(a => a.Cars.Select(b => b.Drivers));作品选择驱动程序但如果我尝试使用我做同样的事情var resultDriver = from a in queryable from b in a.Cars from c in b.Drivers select c;我得到'System.NotSupportedException':{“$project or $group does not support {document}.”}

3)最后有没有办法将上述结果从List<IEnumerable<List<Cargo>>>只是展开List<Cargo>

4

0 回答 0