Мы все продумали и сделали, но это было довольно сложно. Ниже приведены различные методы того, как мы достигли конечного результата. Теперь нам просто нужно переосмыслить, как создается наш класс SearchExpression ... но это уже другая история.
1. Синтаксис эквивалентного запроса
var results = from person in persons
from name in person.names
where name.FamilyName.Contains("Smith")
select person;
2. Эквивалентный лямбда-синтаксис
var results = persons.SelectMany(person => person.Names)
.Where(name => name.FamilyName.Contains("Smith"))
.Select(personName => personName.Person);
3. Эквивалентный лямбда-синтаксис с динамическим Linq
var results = persons.AsQueryable().SelectMany("Names")
.Where("FamilyName.Contains(@0)", "Smith")
.Select("Person");
Примечания - Вам потребуется добавить метод Contains в библиотеку Dynamic Linq.
РЕДАКТИРОВАТЬ - в качестве альтернативы использовать только выбор ... гораздо более простой ... но это требует добавления метода Contains, как отмечено выше.
var results = persons.AsQueryable().Where("Names.Select(FamilyName)
.Contains(@0", "Smith)
Первоначально мы пытались это сделать, но столкнулись с ужасным «Не существует применимого статистического метода Contains». ошибка. Я много раз говорил о том, как мы решили проблему при попытке заставить работать SelectMany ... поэтому просто вернулись к методу Select.