2012-04-11 3 views
2

J'ai mis à jour mon projet avec le pilote MongoDb C# 1.4 et l'une de mes expressions Lambda ne fonctionne plus. Avant d'utiliser MongoDb C# Driver 1.3.1 avec Fluent Mongo pour prendre en charge Linq.L'expression Lambda ne fonctionne pas avec MongoDb C# Driver 1.4

Voici ma méthode:

IQueryable<T> IBackend<T>.Get(System.Linq.Expressions.Expression<Func<T, bool>> expression) 
{ 
    return collection.AsQueryable<T>().Where(expression); 
} 

Cette expression lambda fonctionne:

var addedCustomer = repo.Get(c => c.FirstName == "Elwood").SingleOrDefault(); 

Celui-ci lance maintenant une exception:

var updatedCustomer = repo.Get(c => c.Id == customer.Id).SingleOrDefault(); 

Jeté message d'exception:

Object reference not set to an instance of an object. 

mise à jour voici mon stacktrace:

MongoDB.Bson.dll!MongoDB.Bson.Serialization.BsonClassMapSerializer.GetMemberSerializationInfo(string memberName) Line 253 + 0x3 bytes C# 
MongoDB.Driver.dll!MongoDB.Driver.Linq.SelectQuery.GetSerializationInfoMember(MongoDB.Bson.Serialization.IBsonSerializer serializer, System.Linq.Expressions.MemberExpression memberExpression) Line 962 + 0xc bytes C# 
MongoDB.Driver.dll!MongoDB.Driver.Linq.SelectQuery.GetSerializationInfo(MongoDB.Bson.Serialization.IBsonSerializer serializer, System.Linq.Expressions.Expression expression) Line 888 + 0xf bytes C# 
MongoDB.Driver.dll!MongoDB.Driver.Linq.SelectQuery.GetSerializationInfo(System.Linq.Expressions.Expression expression) Line 880 + 0xf bytes C# 
MongoDB.Driver.dll!MongoDB.Driver.Linq.SelectQuery.BuildComparisonQuery(System.Linq.Expressions.BinaryExpression binaryExpression) Line 433 + 0x1f bytes C# 
MongoDB.Driver.dll!MongoDB.Driver.Linq.SelectQuery.BuildQuery(System.Linq.Expressions.Expression expression) Line 768 + 0x37 bytes C# 
MongoDB.Driver.dll!MongoDB.Driver.Linq.SelectQuery.BuildQuery() Line 113 + 0xc bytes C# 
MongoDB.Driver.dll!MongoDB.Driver.Linq.SelectQuery.Execute() Line 122 + 0x9 bytes C# 
MongoDB.Driver.dll!MongoDB.Driver.Linq.MongoQueryProvider.Execute(System.Linq.Expressions.Expression expression) Line 147 + 0xb bytes C# 
MongoDB.Driver.dll!MongoDB.Driver.Linq.MongoQueryProvider.Execute<Lion.Tools.Tests.Backends.Entities.Customer>(System.Linq.Expressions.Expression expression) Line 131 + 0xc bytes C# 
[External Code] 
Lion.Tools.Tests.dll!Lion.Tools.Tests.Backends.MongoDbBackendTests.MongoDb_Can_Add_Select_And_Update_Test() Line 79 + 0x27f bytes C# 
[External Code] 

Toute idée sur ce qui se passe mal?

Merci

+1

Avez-vous vérifié que 'client' n'est pas' null'? –

+0

Oui, le client n'est pas nul – Swell

+1

Vous devez ajouter la trace de la pile, sachant où l'origine de l'exception est une information très utile. –

Répondre

6

Il y a un bug dans la version 1.4 du pilote C# qui affecte les requêtes LINQ contre les propriétés héritées:

https://jira.mongodb.org/browse/CSHARP-418

Cela a été corrigé dans la branche principale et le correctif sera dans le 1.4. 1 sortie que nous prévoyons de sortir prochainement.

+2

Parfait, merci pour la réponse – Swell

+0

Veuillez le faire bientôt plus tôt :-) Mais, comme un travail autour, on peut simplement implémenter la propriété dans la classe Top. Faites en sorte que BsonClassMap ignore la propriété de base. (Je peux le faire parce que ma WebApp ne lit que cela, cela pourrait donner d'autres problèmes si l'écriture doit être supportée. – Syska

0

Il n'y a rien qui soit manifestement faux. Vous devez vérifier plusieurs choses:

  1. Est-ce que vous lancez vraiment la ligne que vous nous avez montrée?
  2. Est-ce que repo est null?
  3. Est customer et non null, par ex. cela fonctionne-t-il si vous remplacez customer.Id par une valeur fixe comme 1? Assurez-vous que repo.Get(...) ne renvoie jamais null.
+0

1. l'exception est levée lorsque la requête Linq est évaluée, 2.repo n'est pas nul, 3. le client n'est pas nul ... La requête échoue seulement quand je fais mon expression lambda sur Id ... sur FirstName cela fonctionne – Swell

0

Pas beaucoup pour aider mais, Où l'expression retourne généralement quelque chose ou jette un NotFound. Dans ce cas, cela signifie que le repo ou le client est nul.

Si vous pensez que la mise à jour du fournisseur a causé cela, essayez de vérifier la valeur de retour Où.

Questions connexes