универсальный метод, получающий неоднозначную ошибку вызова

Я использую шаблон репозитория и пытаюсь создать общий метод, так как у меня есть несколько объектов, которые извлекаются из своих репозиториев таким же образом:

Мои репозитории создаются следующим образом:

public interface IEntityRepository<T> : IDisposable

public interface IAuditorRepository : IEntityRepository<Auditor>

public class AuditorRepository : IAuditorRepository

Класс Auditor, если он определен как:

public class BaseEntity : IObjectWithState

public partial class Auditor : BaseEntity

Помимо AuditorRepository, у меня есть несколько других, таких как BuildingRepository. Теперь я пытаюсь создать общий метод, в котором я мог бы передать репозиторий:

    public List<EditSelectItemViewModel> GetItems<T>(IEntityRepository<T> repos) where T : BaseEntity 
    {
        var d = repos.All.Where(x => x.isActive).OrderBy(x => x.Name).Include(z => z.Contracts)
            .Select(y => new EditSelectItemViewModel
            {
                Id = y.Id,
                SourceName = y.Name,
                DisplayOnNew = y.DisplayOnNew,
                NumberOfTimesUsed = y.ActiveContracts.Count(a => a.isActive)
            }).ToList();

        return d;
    }

Но я продолжаю получать сообщение об ошибке в .Where о том, что это неоднозначная ссылка. Все репозитории реализуют метод All, например, ниже представлена ​​версия AuditorRepository:

    public IQueryable<DomainClasses.Auditor> All
    {
        get { return _context.Auditors; }
    }

IEntityRepostiory определяется как:

    public interface IEntityRepository<T> : IDisposable
{
    IQueryable<T> All { get; }
    //List<T> AllRequests { get; }
    IQueryable<T> AllIncluding(params Expression<Func<T, object>>[] includeProperties);
    T Find(params object[] keyValues);
    void InsertOrUpdateGraph(T entityGraph);
    void InsertOrUpdate(T entity);
    void Delete(params object[] keyValues);

}

и baseEntity:

    public class BaseEntity : IObjectWithState
{
    public State State { get; set; }
}

Состояние определяется как:

    public interface IObjectWithState
{
    State State { get; set; }
}
public enum State
{
    Added,
    Unchanged,
    Modified,
    Deleted
}

person Paritosh    schedule 14.07.2014    source источник
comment
Определено ли свойство All и в интерфейсе IEntityRepository<>?   -  person Jeppe Stig Nielsen    schedule 14.07.2014
comment
@JeppeStigNielsen да, я только что обновил свой вопрос, чтобы включить его.   -  person Paritosh    schedule 14.07.2014
comment
Не могли бы вы опубликовать реализацию класса BaseEntity?   -  person Jämes    schedule 14.07.2014
comment
@ZenLulz готово, добавлено к моему вопросу выше.   -  person Paritosh    schedule 14.07.2014
comment
Да, и, пожалуйста, укажите точное сообщение об ошибке, которое вы получили.   -  person Jeppe Stig Nielsen    schedule 15.07.2014
comment
Тогда что будет .isActive в первой лямбде x => x.isActive?   -  person Jeppe Stig Nielsen    schedule 15.07.2014
comment
Сообщение об ошибке T 'не содержит определения для 'isActive', и не удалось найти метод расширения 'isActive', принимающий первый аргумент типа 'T' (вам не хватает директивы using или ссылки на сборку?)   -  person Paritosh    schedule 15.07.2014
comment
isActive — это свойство класса Auditor.   -  person Paritosh    schedule 15.07.2014
comment
Думаю, теперь я понял, BaseEntity должен иметь .isActive, а не производные классы, поскольку я сказал, что метод T имеет тип BaseEntity.   -  person Paritosh    schedule 15.07.2014


Ответы (1)


Как я изначально думал, ошибка неоднозначного вызова возникает из-за того, что лямбда-выражение x => x.isActive недействительно из-за отсутствия определения переменной isActive в классе BaseEntity (класс, используемый в качестве ограничения параметра типа в методе GetItems).

Ошибку можно воспроизвести с помощью этого кода:

(new object[0]).AsQueryable().Where(o => o == notDefined);

В моем контексте notDefined не определено, что одновременно вызывает ошибку неоднозначного вызова в методе расширения Where. Как только лямбда-выражение исправлено (например, o != null), ошибка больше не возникает.

Скриншот этой неоднозначной ошибки вызова с другими соответствующими методами.

введите здесь описание изображения

person Jämes    schedule 14.07.2014