Я построил построитель запросов, основанный на некоторых сущностях, используя обобщенные элементы.Я хочу иметь определенный синтаксис, который выглядит следующим образом:
Repository.Objects.Where
.State.Equals(ObjectState.Created)
.ParentId.Equals(new ObjectId(0))
.GetAsync();
Свойство Where
возвращает объект построителя запросов, который содержит отдельные свойства объекта, которые можно сравнивать с чем-либо.Теперь проблема в том, что Object
является просто базовым типом, и вы можете запросить более конкретные свойства, поэтому я подумал, что было бы неплохо иметь такой синтаксис:
Repository.Objects.Where.AsObjectSystem
.RequiredFactors.Equals(AuthenticationFactor.Password)
.State.Equals(ObjectState.Created)
.ParentId.Equals(new ObjectId(0))
.GetAsync();
RequiredFactors являетсясвойство из ObjectSystem
, но каждый раз, когда я хочу вызвать свойство из этого, мне нужно снова вызывать AsObjectSystem
, что вовсе не желательно, и в этом моя проблема.Сначала код:
public interface IQueryBuilderObject : IQueryBuilder<IQueryBuilderObject, Object, IObjectCollection>
{
IPropertyFilterIdentifier<IQueryBuilderObject, ObjectId> Id { get; }
IPropertyFilterIdentifier<IQueryBuilderObject, ObjectId> ParentId { get; }
IPropertyFilterIdentifier<IQueryBuilderObject, ObjectId> TemplateId { get; }
IPropertyFilterIdentifier<IQueryBuilderObject, UserId> EditorId { get; }
IPropertyFilterString<IQueryBuilderObject> InternalId { get; }
IPropertyFilterString<IQueryBuilderObject> ExternalId { get; }
IPropertyFilterString<IQueryBuilderObject> Description { get; }
IPropertyFilterEnum<IQueryBuilderObject, ObjectState> State { get; }
IPropertyFilterString<IQueryBuilderObject> ObjectClass { get; }
IPropertyFilterString<IQueryBuilderObject> DisplayNameShort { get; }
IPropertyFilterString<IQueryBuilderObject> DisplayNameLong { get; }
IQueryBuilderObjectSystem AsObjectSystem { get; }
}
public interface IQueryBuilderObjectSystem : IQueryBuilderObject
{
IQueryBuilderObjectSystem And(Action<IQueryBuilderObjectSystem> queryBuilder);
IQueryBuilderObjectSystem Or(Action<IQueryBuilderObjectSystem> queryBuilder);
IPropertyFilterEnum<IQueryBuilderObjectSystem, AuthenticationFactor> RequiredFactors { get; }
IQueryBuilderObjectSystemSubSystem AsSubSystem { get; }
IQueryBuilderObjectSystemSystemGroup AsSystemGroup { get; }
IQueryBuilderObjectSystemIoSystem AsIoSystem { get; }
IQueryBuilderObjectSystemContainer AsContainer { get; }
IQueryBuilderObjectSystemApplication AsApplication { get; }
}
public interface IPropertyFilter<TQueryBuilder, TEntityType> : IPropertyFilter
where TQueryBuilder : IQueryBuilder
{
IPropertyFilter<TQueryBuilder, TEntityType> Not { get; }
TQueryBuilder Equals(TEntityType value);
TQueryBuilder Null();
}
Свойства IPropertyFilter...
являются решающим фактором здесь.Первый тип определяет, какой тип IQueryBuilder
они будут возвращать.Так что те из IQueryBuilderObject
будут возвращать только свой собственный тип, так же как и IQueryBuilderObjectSystem
.Как только я вызываю свойство из IQueryBuilderObject
, AsObjectSystem
необходимо повторить.
Я хочу, чтобы эти IPropertyFilter...
всегда возвращали значение текущего класса.Обратите внимание, что иерархия опускается на 3 уровня и может получить больше позже, например:
Object> ObjectSystem> ObjectSystemSubSystem
Edit: добавлен интерфейс IPropertyFilter
Как вы можете видетьвозвращаемый тип Equals, Null и всех других операторов равен первому универсальному значению.Я хочу, чтобы это был тип класса, в котором этот объект был создан.
Также извините, я не был достаточно ясен ранее: Дело в том, что я не могу использовать LINQ для итерации базы данных SQL с100 000 строк и более для простого запроса, например, для поиска идентификатора.Я в основном конвертирую построенный запрос в SQL, используя построитель SQL, который я построил, но здесь дело не в этом.
TL; DR: мне нужно сделать запрос SQL из этого