我使用泛型基于某些实体构建了查询构建器。我想要某种看起来像这样的语法:
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查询