假设您有一个名为 Documents 的列表。它有两列,分别称为“一”和“二”。您可以很好地进行 Linq to SP 查询:
DataContext dc = new DataContext("http://sharepoint");
var varResults = (from item in dc.Documents
where item.Two == "blah"
orderby item.One descending
select item);
然后您决定要对网站栏使用内容类型。当您从列表中删除列“一”和“二”时,上述查询会中断。您制作网站栏并将它们分配给称为“主”的内容类型,父项是项目。 Master 有两种派生自它的内容类型,称为“CloneA”和“CloneB”。由于克隆内容类型的父级是 Master,因此它们会自动获取它的站点列。当您将内容类型分配给列表时,定义如下所示:
Column - Content types
Title - Documents, Master, CloneA, CloneB
One - Master, CloneA, CloneB
Two - Master, CloneA, CloneB
克隆内容类型稍后将用于不同的信息策略以保留在文档列表中。在打破继承并对内容类型设置保留策略后,现在项目可以单独设置为将导致保留(1 天 - CloneA,1 周 - CloneB)开始的内容类型。
但是 linq to SP 查询仍然中断。即使显示了站点列,SPMetal 也出于某种原因仅捕获基本内容类型。因此,对于 linq,上述查询中的列并不真正存在。输入“哪里的项目”。 “二”甚至没有出现。您必须对其进行强制转换才能使其工作(可能没有正确解释)。所以这是工作代码:
DataContext dc = new DataContext("http://sharepoint");
var varResults = (from item in dc.Documents.OfType<Master>()
where item.Two == "blah"
orderby item.One descending
select item);
你可能很想使用
var varResults = (from item in dc.Documents.OfType<DocumentsMaster>()
不幸的是,这只会返回与列表中该内容类型关联的项目。因此,如果您想过滤特定内容类型的项目,请自行淘汰。