У меня есть следующая структура документа:
{
Foo: BinData
Bar: Integer
}
Я хочу искать эти документы (у них есть другие поля) двумя полями Foo и Bar (они вместе составляют ключ для поиска).
В настоящее время я делаю это:
List<Tuple<byte[], int>> fooBarList = mySearchValues;
return Collection.AsQueryable().OfType<MyType>()
.Where(x => fooBarList.Any(y => x.Foo == y.Item1 && x.Bar == y.Item2))
.ToArray();
Однако Mongo не понимает, как сериализовать этот запрос.
System.NotSupportedException: Unable to determine the serialization information for the expression: System.Collections.Generic.List'1[System.Tuple'2[System.Byte[],System.Int32]].
at MongoDB.Driver.Linq.Utils.BsonSerializationInfoFinder.GetSerializationInfo(Expression node, Dictionary'2 serializationInfoCache)
at MongoDB.Driver.Linq.PredicateTranslator.BuildAnyQuery(MethodCallExpression methodCallExpression)
at MongoDB.Driver.Linq.PredicateTranslator.BuildMethodCallQuery(MethodCallExpression methodCallExpression)
at MongoDB.Driver.Linq.PredicateTranslator.BuildQuery(Expression expression)
at MongoDB.Driver.Linq.PredicateTranslator.BuildQuery(Expression expression)
at MongoDB.Driver.Linq.SelectQuery.Execute()
at MongoDB.Driver.Linq.MongoQueryable'1.GetEnumerator()
at System.Linq.Buffer'1..ctor(IEnumerable'1 source)
at System.Linq.Enumerable.ToArray[TSource](IEnumerable'1 source)
Кто-то уже получил подобный запрос к этому, если да, то как я могу это сделать? Я не могу использовать $ in, поскольку это работает только в одном документе.
Текущая версия драйвера (1.x) построена для.NET 3.5 и не знает о том, как сериализовать кортежи. Если вы хотите, вы можете написать сериализатор кортежей и зарегистрировать его таким образом, чтобы этот запрос мог работать.
Тем не менее, я бы предположил, что было бы просто не использовать Tuple и вместо этого создать простой частный класс и использовать его вместо этого.