C# 针灸Bql与仿制药C

C# 针灸Bql与仿制药C,c#,.net,acumatica,C#,.net,Acumatica,这是AcumaticaERP特有的。我创建了一个BaseBlcHelper类,如下所示: public abstract class BaseBlcHelper<TBlcObject, TDacObject> : PXGraph<TBlcObject>,

这是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);
我创建这个类是因为我想我可以在其中加入一些共享功能。 问题就在这里。当我有这样的select语句时:

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

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

下面是一个以通用图、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对象。之后,您可以创建一个PXView对象,该对象将BQLCommand作为输入参数。最后,执行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;
}