我正在使用SPMetal为我的SharePoint站点生成实体类,但我不完全确定当有多种内容类型时最佳实践是什么为单个列表。例如,我有一个任务列表,其中包含2种内容类型,我通过SPMetal的配置文件定义它们。这里是我的定义...LINQ to Sharepoint单个列表的多种内容类型
<List Member="Tasks" Name="Tasks">
<ContentType Class="LegalReview" Name="LegalReviewContent"/>
<ContentType Class="Approval" Name="ApprovalContent"/>
</List>
这似乎在生成的对象工作得很好也从WorkflowTask但对于数据的背景下产生的类型继承是WorkflowTask的名单。所以当我做一个查询时,我得到一个WorkflowTask对象而不是LegalReview或Approval对象。我如何让它返回正确类型的对象?
[Microsoft.SharePoint.Linq.ListAttribute(Name="Tasks")]
public Microsoft.SharePoint.Linq.EntityList<WorkflowTask> Tasks {
get {
return this.GetList<WorkflowTask>("Tasks");
}
}
UPDATE 感谢回去我。我不知道如何重新创建基于SPListItem的类型,并希望得到任何反馈。
ContractManagementDataContext context = new ContractManagementDataContext(_url);
WorkflowTask task = context.Tasks.FirstOrDefault(t => t.Id ==5);
Approval a = new Approval(task.item);
public partial class Approval{
public Approval(SPListItem item){
//Set all properties here for workflowtask and approval type?
//Wouldn't there be issues since it isn't attached to the datacontext?
}
public String SomeProperty{
get{ //get from list item};
set{ //set to list item};
}
嗨Rob感谢您的反馈,一个很好的战略,以获得底层的SPListItem。我仍然不确定你将如何创建一个给定列表项目的实体......是否会像更新后的问题一样? – 2012-02-22 22:02:54
是的,你可以做那样的事情。不需要直接从SPListItem中提取值的附加属性,因为您将在创建对象时初始化实体上的属性。你对这个实体没有被附加到上下文也是正确的。我没有包含它,因为它取决于需求,但如果您需要更新/删除,则可以将实体附加到合适的上下文中。还有其他方法可以降低,例如一个静态的EntityConverter类或每个基类型的方法。让我知道如果你需要一个例子,我会更新答案。 – robwilliams 2012-02-23 12:16:09
嗨,Rob,如果你能发布你的entityconverter类的例子,如果它对你来说不是太多工作,我会很感激。再次感谢所有的帮助! – 2012-02-23 16:47:47