Мне нужно использовать 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"
}
}
}
}
}
Спасибо за любую помощь.