Ошибка преобразования выражения при использовании универсального репозитория на MongoDB - PullRequest
0 голосов
/ 12 июня 2019

У меня возникли проблемы с созданием универсального репозитория mongodb (моя коллекция сделана как GenericRepositoryEntry)

 public static void SaveRepositoryEntry<TDataObject>(
        TDataObject msg,
        Func<GenericRepositoryEntry<TDataObject>, bool> finder01,
        Expression<Func<GenericRepositoryEntry<TDataObject>, bool>> finder02,
        Func<GenericRepositoryEntry<DataValue>, bool> finder03,
        Expression<Func<GenericRepositoryEntry<DataValue>, bool>> finder04)
        where TDataObject : DataValue
    { 
            using (var ctx = new MongoContext())
            {
                IMongoQueryable<GenericRepositoryEntry<DataValue>> iQuery = ctx.DataValues.AsQueryable();

                var items01 = iQuery.Where(x => finder01(x)).ToList(); //compile error
                var items02 = iQuery.Where(finder02).ToList(); //compile error
                var items03 = iQuery.Where(x => finder03(x)).ToList();
                var items04 = iQuery.Where(finder04).ToList();
            }
    }

это класс коллекции репо

 public class GenericRepositoryEntry<T>
 {
    [BsonId(IdGenerator = typeof(CombGuidGenerator))]
    public Guid Id { get; set; }

    public T DataObject { get; set; }
    public DateTime LastEditDate { get; set; }
    public bool ActualFlag { get; set; }
 }

items01:

cannot convert from 'GlobalElectricGateway.Core.Model.MongoEntry.GenericRepositoryEntry<GlobalElectricGateway.Core.Model.Ocpp.DataValue>' to 'GlobalElectricGateway.Core.Model.MongoEntry.GenericRepositoryEntry<TDataObject>'

items02:

 cannot convert from 'System.Linq.Expressions.Expression<System.Func<GlobalElectricGateway.Core.Model.MongoEntry.GenericRepositoryEntry<TDataObject>, bool>>' to 'System.Linq.Expressions.Expression<System.Func<GlobalElectricGateway.Core.Model.MongoEntry.GenericRepositoryEntry<GlobalElectricGateway.Core.Model.Ocpp.DataValue>, int, bool>>'

items03 и items04

в порядке... потому что я не использую универсальный тип: (

я получаю ошибку компиляции на items01 / items02, похоже, что она игнорирует - where TDataObject : DataValue

также пытается изменить сигнатуру метода SaveRepositoryEntry как

where TDataObject : IMongoEntryDataItem

и изменение repoEntryClass

public class GenericRepositoryEntry<T> where T: IMongoEntryDataItem

...