C # Всегда возвращайте тип возвращаемого значения для текущего класса - PullRequest
0 голосов
/ 26 февраля 2019

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

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 из этого

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...