2014-12-10 5 views
1

я иметь следующую структуру документа:MongoDB запрос с Кортежем

{ 
    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(); 

Однако Монго не понимает, как сериализовать этот запрос.

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, поскольку это работает только в одном документе.

ответ

0

Текущая версия драйвера (1.x) построена для .NET 3.5 и не знает о том, как сериализовать кортежи. Если вы хотите, вы можете написать сериализатор кортежей и зарегистрировать его таким образом, чтобы этот запрос мог работать.

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

+0

Привет Крейг, спасибо вам за помощь. Использование частного класса или анонимного класса не устраняет это. Он просто дает ту же ошибку, но с другим именем класса. Невозможно определить информацию о сериализации для выражения: Temp []: {Namespace + Temp}. – James

+0

Можете ли вы рассказать мне, как должен выглядеть запрос mongodb? –

+0

Запрос должен искать документы, которые соответствуют как Foo, так и Bar в списке данных запроса (пар Foo и Bar). Существует пример C# того, что я ожидаю, что это должно выглядеть выше. – James

Смежные вопросы