Попытка конвертировать Linq в динамический Linq - PullRequest
0 голосов
/ 18 октября 2019

Мне нужно использовать Linq Dynamic для генерации некоторых запросов во время выполнения. До сих пор все работало, но я столкнулся с проблемой извлечения информации о вложенных свойствах.

Хотя я провел довольно обширный поиск и нашел некоторое руководство, яМы не нашли ничего, что решает эту конкретную проблему.

Этот код linq делает то, что я хочу. Я украл пример отсюда ( Dynamic Expressions LINQ Select - SelectMany из вложенной коллекции ) и немного изменил структуру, которую я включил ниже.

var result = data.SelectMany(a => a.Addresses.SelectMany(g => g.MyTest).Where(f => f.MyTestString == "Mugi"), (Apprentice, addr) => new { Apprentice });

Это возвращает правильный результат, который возвращает запись, в которой MyTestString = Mugi.

    "Apprentice": {
      "FamilyName": "g",
      "Addresses": [
        {
          "AddressLine1": "address xxxx",
          "MyTest": [
            {
              "MyTestString": "Yako",
              "OtherString": "Other String 3"
            }
          ]
        },
        {
          "MyTest": [
            {
              "MyTestString": "Mugi",
              "OtherString": "Other String 4"
            }
          ]
        }
      ]
    }

Ближайший динамический результат:

var resultDynamic = data.AsQueryable().Select("new (it as Apprentice, Addresses.SelectMany(MyTest).Where(MyTestString == \"Mugi\") as MT)");

Результаты этого:

{
    "Apprentice": {      
      "FamilyName": "f",
      "Addresses": [
        {
          "AddressLine1": "address x",
          "MyTest": [
            {
              "MyTestString": "This is Test String 1",
              "OtherString": "Other String 1"
            }
          ]
        },
        {
          "AddressLine1": "address y",
          "MyTest": [
            {
              "MyTestString": "bleck",
              "OtherString": "Other string 2"
            }
          ]
        }
      ]
    },
    "MT": []
  },
  {
    "Apprentice": {
      "FamilyName": "g",
      "Addresses": [
        {
          "AddressLine1": "address xxxx",
          "MyTest": [
            {
              "MyTestString": "Yako",
              "OtherString": "Other String 3"
            }
          ]
        },
        {
          "AddressLine1": "address yyyy",
          "MyTest": [
            {
              "MyTestString": "Mugi",
              "OtherString": "Other String 4"
            }
          ]
        }
      ]
    },
    "MT": [
      {
        "MyTestString": "Mugi",
        "OtherString": "Other String 4"
      }
    ]
  }

Динамическая версия возвращает каждый экземпляр Apprentice, но заполняет только те поля, где соответствует SelectMany. Очевидно, что это неправильно, но в этом и заключается моя проблема.

Используемые мной данные:

new Apprentice {
                    FamilyName = "f",
                    Addresses = new []
                    {

                        new ApprenticeAddress {
                            AddressLine1 = "address x",
                            MyTest = new []
                            {
                                new MyTest {
                                    MyTestString = "This is Test String 1",
                                    OtherString = "Other String 1"
                                }
                            }
                        },
                        new ApprenticeAddress {
                            AddressLine1 = "address y",
                            MyTest = new []
                            {
                                new MyTest {
                                    MyTestString = "bleck",
                                    OtherString = "Other string 2"
                                }
                            }
                        }
                    }
                },
                new Apprentice {
                    FamilyName = "g",
                    Addresses = new []
                    {

                        new ApprenticeAddress {
                            AddressLine1 = "address xxxx",
                            MyTest = new []
                            {
                                new MyTest {
                                    MyTestString = "Yako",
                                    OtherString = "Other String 3"
                                }
                            }
                        },
                        new ApprenticeAddress {
                            AddressLine1 = "address yyyy",
                            MyTest = new []
                            {
                                new MyTest {
                                    MyTestString = "Mugi",
                                    OtherString = "Other String 4"
                                }
                            }
                        }
                    }
                }

Спасибо за любую помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...