我正在尝试使用TreeProvider
来查询所有从基页类型继承的页面,此处称为My.Product
。我还为该基页类型集成了生成的C#类,以便获得对页面类型值的强类型访问。
以下查询,不使用生成的页面类型,工作正常:
//returns all products as TreeNode
var products = tree.SelectNodes()
.OnSite("MyWebSite")
.Types("My.Product*")
将生成的类型与SelectNodes
的通用版本一起使用,不能使用Types
扩展名,也不会返回任何页面。我假设因为未包含继承的页面类型。
//returns nothing
var products = tree.SelectNodes<Product>()
.OnSite("MyWebSite");
基于this answer我尝试了演员:
var products = tree.SelectNodes()
.OnSite("MyWebSite")
.Types("My.Product*")
.ToList()
.Cast<Product>();
但演员阵容失败了:
无法将“CMS.Ecommerce.SKUTreeNode”类型的对象转换为“CMS.DocumentEngine.Types.Product”。
我也尝试从查询结果构建页面类型对象:
var products = tree.SelectNodes()
.OnSite("MyWebSite")
.Types("My.Product*")
.ToList()
.Select(x => TreeNode.New<Product>(null, x, tree))
.ToList();
但API不喜欢类名不匹配:
输入类名称'My.ProductInheritingType与请求的类型'CMS.DocumentEngine.Types.Product'不一致,其类名为'My.Product'。要解决此问题,请使用正确的类名或null作为输入参数。
有没有办法在我的强类型页面类型中使用TreeProvider
,并检索使用继承页面类型的页面?
答案 0 :(得分:0)
我不知道这是不是最好的方法,但它现在正在运作。有几个问题需要克服:
对于上面的最后一项,如果文档类名称不匹配,我找不到让Kentico API初始化我的基本Product类型的方法。所以我不得不扩展生成的类并调用受保护的初始化方法:
public partial class Product
{
public void Initialize(IDataContainer data, TreeProvider treeProvider)
{
base.Initialize(this.ClassName, data, treeProvider);
}
}
然后,我可以在LINQ语句中构造和初始化此类,该语句还包括查询我的基页类型的所有继承类型,所有支持数据列使用DocumentHelper
API而不是{{1 }}
TreeProvider
答案 1 :(得分:-1)
您可以使用.WhereEquals(“ClassInheritsFromClassID”,TheMyProductClassID)来获取从该类继承的所有类。这可能是最好的路线。下面应该是大致正确的语法。
int MyProductClassID = DataClassInfoProvider.GetClassInfo("My.Product").ClassID;
var AllInheritedClassIDs = DataClassInfoProvider.GetClasses().WhereEquals("ClassInheritsFromClassID", MyProductClassID).Select(x=> x.ClassID).ToList();
var products = tree.SelectNodes()
.OnSite("MyWebSite")
.WhereIn("NodeClassID", AllInheritedClassIDs);
.ToList();