[CSHARP-723] Enum can't be deserialized when using Linq Created: 11/Apr/13  Updated: 19/Oct/16  Resolved: 16/Apr/13

Status: Closed
Project: C# Driver
Component/s: None
Affects Version/s: 1.8.1
Fix Version/s: None

Type: Bug Priority: Critical - P2
Reporter: kelly elton Assignee: Sridhar Nanjundeswaran
Resolution: Won't Fix Votes: 0
Labels: C#, Enum, Linq
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

.net 4.5 Windows Ubuntu 12.04



 Description   

So I have this enum

    public enum JobStatus
    {
        Created = 0,
        Assigning = 1,
        Assigned = 2,
        Started = 3,
        Finished = 4
    }

In this interface

    public interface IJob
    {
        Guid Id { get; set; }
        JobStatus Status { get; set; }
        bool IsFaulted { get; set; }
        string ErrorMessage { get; set; }
    }

I plop one of these guys in the database, and it goes fine. Then when I try and grab one with this code

    Database.GetCollection<IJob>("Jobs").AsQueryable().FirstOrDefault(x=>x.Status == JobStatus.Created);

That throws an exception

Unable to determine the serialization information for the expression: jobs.Status.
   at MongoDB.Driver.Linq.Utils.BsonSerializationInfoFinder.GetSerializationInfo(Expression node, Dictionary`2 serializationInfoCache)
   at MongoDB.Driver.Linq.Utils.BsonSerializationInfoHelper.GetSerializationInfo(Expression node)
   at MongoDB.Driver.Linq.PredicateTranslator.BuildComparisonQuery(Expression variableExpression, ExpressionType operatorType, ConstantExpression constantExpression)
   at MongoDB.Driver.Linq.PredicateTranslator.BuildComparisonQuery(BinaryExpression binaryExpression)
   at MongoDB.Driver.Linq.PredicateTranslator.BuildQuery(Expression expression)
   at MongoDB.Driver.Linq.SelectQuery.BuildQuery()
   at MongoDB.Driver.Linq.SelectQuery.Execute()
   at MongoDB.Driver.Linq.MongoQueryProvider.Execute(Expression expression)
   at MongoDB.Driver.Linq.MongoQueryProvider.Execute[TResult](Expression expression)
   at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 source)

My first go I didn't have the enums assigned to integers, and that produced the same result. I'm seeing this on two different machines, and two fresh installs of MongoDb, one on windows and one on Ubuntu 12.04.



 Comments   
Comment by kelly elton [ 16/Apr/13 ]

Minus the enums it seems to work fine. It seems like if I return an
enumerable and then filter on that it works.

Thanks,
Kelly Elton
http://www.kellyelton.com

On Tue, Apr 16, 2013 at 3:38 PM, Sridhar Nanjundeswaran (JIRA) <

Comment by Sridhar Nanjundeswaran [ 16/Apr/13 ]

The reason it fails is that we do not support deserializing interfaces. This is because the different implementations could have different serialization settings and the driver would not know which of the classmaps it needs to use in the deserialization process.
Database.GetCollection<X>("Jobs").... where X is a class that implements IJob should resolve the issue

Generated at Wed Feb 07 21:37:39 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.