1

这是 AcumaticaERP 特有的。我创建了一个看起来像这样的 BaseBlcHelper 类:

public abstract class BaseBlcHelper<TBlcObject, TDacObject> :
                                                            PXGraph<TBlcObject>,
                                                            IBaseBlcHelper<TDacObject, TDacObject> where TBlcObject : PXGraph
                                                            where TDacObject : class, IBqlTable, new()

我创建了这个类,因为我认为我可以在其中放置一些共享功能。
这是问题所在。当我有这样的选择语句时:

Vendor next_vendor = (Vendor)PXSelect<Vendor, Where<Vendor.vendor1099, Equal<True>>, OrderBy<Desc<Vendor.acctCD>>>.Select(this);

您将如何将 TDacObject(通用)对象解析为查询的“Vendor.vendor1099”部分等等?

4

1 回答 1

1

我假设您将创建将 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;
}
于 2018-09-07T14:19:46.853 回答