Я пытаюсь создать многократно используемые поисковые запросы в моем базовом классе, поэтому мне не нужно повторять один и тот же код для каждого класса с производными данными, но я не могу заставить инфраструктуру сущностей играть хорошо.
У меня есть 3классы: CMEntityBase CMSite CMSiteServer
Site & SiteServer оба являются производными от CMEntityBase, который имеет общие свойства (ID, имя и т. д.)
Я хочу определить некоторые общие запросы: например, GetByName
using (var db = new LNOSCMDataModel())
{
db.Configuration.LazyLoadingEnabled = false;
var servers = db.CMSiteServers.
AsNoTracking().
GetByName(id,Active).
ConvertToAPIVM().ToList();
}
я попытался определить GetByName несколькими способами:
базовый класс:
public static IQueryable<CMEntityBase> GetByName(this IQueryable<CMEntityBase> Entities, string Name, bool Active = true)
{
return Entities.Where(ss => ss.Name == Name && ss.Active == Active || Active == false);//.Cast<IEntity>();
}
универсальный:
public static IQueryable<T> GetByName<T>(this IQueryable<CMEntityBase> Entities, string Name, bool Active = true) where T : CMEntityBase
{
return Entities.Where(ss => ss.Name == Name && ss.Active == Active || Active == false).Cast<T>();
}
я попытался определить базовый классв качестве интерфейса и в общем случае с использованием T: class, IEntity (interface) -> этот подход возник из: LINQ to Entities поддерживает только приведение типов примитивов или перечислений EDM с интерфейсом IEntity
в конечном итоге все они возвращают ошибку:
LINQ to Entities поддерживает только приведение типов примитивов или перечислений EDM с интерфейсом IEntity.
в конечном счете, я хочуo определить запрос по свойствам базового класса, но вывести дочерний класс.сейчас кажется, что мне нужно скопировать / вставить мои методы для производного класса.