我假设您将创建将 DAC Field 参数作为泛型类型的 Helper 方法。
这是一个示例原型,它以通用图形、DAC 类型、字段类型和字段值作为参数:
public static List<TDacObject> Select<TFieldObject>(this PXGraph graph, object fieldParamValue)
where TFieldObject : class,IBqlField
where TDacObject : class,IBqlTable
{
// 'graph' will be used to provide the required context for query execution
// 'TDacObject' is a generic DAC type used in the query
// 'TFieldObject' is a generic DAC type used in the query
// 'fieldParamValue' is a generic value you can use in your query
}
使用泛型类型制作和执行查询的技巧是使用泛型类型来创建 BQLCommand 对象。之后,您可以创建一个将 BQLCommand 作为输入参数的 PXView 对象。最后执行 PXView 的 Select 方法来执行 BQL 查询。
下面是一些通用 Select by ID 方法的示例代码。它应该让您对该过程有一个基本的了解:
// Roughly equivalent to:
// PXSelect<TDacObject, Where<TDacObject.TDacField, Equals<Required<fieldParamValue>>>>
// TDacObject below is extracted from the type 'fieldType.DeclaringType'
// You can substitute that for your generic DAC Type entity
public static List<T> SelectById<T, TField>(this PXGraph graph, object id)
where TField : class, IBqlField
where T : class, IBqlTable
{
return SelectById(graph, typeof(TField), id).Cast<T>().ToList();
}
public static List<object> SelectById(this PXGraph graph, Type fieldType, object id)
{
var select = CreateSelectCommand(fieldType);
var view = GetView(graph, fieldType, select);
return view.SelectMulti(id);
}
public static BqlCommand CreateSelectCommand(Type fieldType)
{
return CreateSelectCommand(fieldType.DeclaringType, fieldType);
}
public static BqlCommand CreateSelectCommand(Type entityType, Type fieldType)
{
Type required = BqlCommand.Compose(typeof(Required<>), fieldType);
Type equal = BqlCommand.Compose(typeof(Equal<>), required);
Type where = BqlCommand.Compose(typeof(Where<,>), fieldType, equal);
return BqlCommand.CreateInstance(typeof(Select<,>), entityType, where);
}
public static PXView GetView(this PXGraph graph, Type fieldType, BqlCommand select)
{
PXView view;
graph.Views.TryGetValue(fieldType.FullName, out view);
if (view == null)
{
view = new PXView(graph, false, @select);
graph.Views.Add(fieldType.FullName, view);
graph.EnsureCachePersistence(fieldType.DeclaringType);
}
return view;
}