I've got some strange behaviour when using linq (1.4.2) queries in repository. If my repository generic parameter has interface clause I got exception on queries. If I use abstract class or normal class instead everything is OK. Here's my test that fails but if we change 'where T : IEntity' with 'where T : Entity' or make IEntity abstract class everything works. Is it a bug or what?
using System;
using System.Linq;
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Linq;
namespace MongoDbTest
{
class Program
{
static void Main()
{
var entity = new Entity();
var repository = new Repository<Entity>();
repository.Save(entity);
repository.Get(entity.Id);
}
}
public class Repository<T> where T : IEntity
{
private readonly MongoCollection<T> collection;
public Repository()
{
var server = MongoServer.Create("mongodb://localhost/?safe=true");
var database = server.GetDatabase("local");
collection = database.GetCollection<T>(typeof(T).Name);
}
// throws null reference exception
public T Get(ObjectId id)
{
return collection.AsQueryable().Single(x => x.Id == id);
}
public void Save(T entity)
{
collection.Save(entity);
}
}
public interface IEntity
{
ObjectId Id { get; set; }
}
public class Entity : IEntity
{
public DateTime Date { get; set; }
public ObjectId Id { get; set; }
}
}