【问题标题】:Acumatica Bql with generics C#Acumatica Bql 与泛型 C#
【发布时间】:2019-02-11 22:54:01
【问题描述】:

这是 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”部分等等?

【问题讨论】:

    标签: c# .net acumatica


    【解决方案1】:

    我假设您将创建将 DAC 字段参数作为泛型类型的 Helper 方法。

    这是一个示例原型,它以通用 Graph、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 查询。

    以下是通用按 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      • 1970-01-01
      • 2022-12-15
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      相关资源
      最近更新 更多