C#始终将返回类型设为当前类的返回类型

时间:2019-02-26 19:03:33

标签: c# entity-framework linq generics

我使用泛型基于某些实体构建了查询构建器。我想要某种看起来像这样的语法:

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个级别,以后可能会有所提高,例如:

对象>对象系统>对象系统子系统

编辑:添加了IPropertyFilter接口

您会看到Equals,Null和其他所有运算符的返回类型等于第一个通用值。我希望这是创建该对象的类的类型。

也很抱歉,我之前不太清楚:重点是,我无法使用LINQ来迭代有时有100,000行甚至更多的SQL数据库,而仅仅是为了简单的请求(例如查找ID)。我基本上使用构建的SQL构建器将构建的查询转换为SQL,但这不是重点。

TL; DR:我需要以此进行SQL查询

0 个答案:

没有答案