У меня есть код, который в настоящее время создает оператор In в SQL. Я строю выражение, оно возвращает;
value(generic(list[T])).Contains(x => x.Id)
Это отлично работает, поэтому, если у меня есть список объектов;
public class ObjectToSearch
{
public int IdToSearchOn {get;set;}
}
И я хочу найти идентификаторы 1, 2, 3, он работает просто отлично. Мой SQL-запрос отличный.
Теперь мне нужно выполнить поиск в списке вложенных объектов, так что я мог бы иметь;
public class ParentObjectToSearch
{
public IEnumerable<ObjectToSearch> Objects {get;set;}
}
Итак, глядя на некоторый код, который я нашел ( Как мне создать дерево выражений, вызывающее IEnumerable .Any (...)? ) Я решил, что могу адаптировать метод и обернуть позвоните любому или всем, и это будет работать. Это прекрасно работало, пока я не пришел на тестирование базы данных, я получаю;
Невозможно сравнить элементы типа 'System.Collections.Generic.ICollection`1'. Поддерживаются только примитивные типы (такие как Int32, String и Guid) и типы сущностей.
var collectionType = GetIEnumerableImpl( forCollection.Type );
Type elementType = collectionType.GetGenericArguments( )[0];
MethodInfo method = BaseFilter.GetType( ).GetMethod( "FilterWith" );
MethodInfo genericMethod = method.MakeGenericMethod( new[] { elementType } );
return (genericMethod.Invoke( BaseFilter, null ) as LambdaExpression);
FilterWith - метод, который я вызываю для исходного фильтра, в надежде вернуть мое выражение Таким образом, похоже, что мое внутреннее выражение оценивается неправильно, в сочетании с внешним выражением. То, к чему я в основном стремлюсь, это (я верю);
x => x.Collection.Contains( y => new { 1, 3, 3}.Contains( y.Id));
Если я тестирую внутреннюю фильтрацию отдельно, она работает нормально, поэтому я предполагаю, что именно так я пытаюсь объединить элементы, и если я пытаюсь использовать Contains вместо Any или All, я все равно получаю ту же ошибку.
Я поместил Entity Framework в теги, потому что это оценивается как выражение для набора сущностей, и у кого-то может быть опыт в этом.
Обновление Имея ночь, чтобы подумать об этом, я думаю, у меня есть вопрос получше;
Как построить выражение Where, чтобы я мог построить;
x => x.Collection.Where (y => new [] {1, 3} .Contains (y.Id)). Count ()> 0