在前面的博文中我们讨论了如何使用Business Connectivity Services对象模型栏获取已部署在SharePoint BCS中的外部内容类型。
本文中我们将学习如何获取一个ECT的BCS方法集合。并且还要通过Business Connectivity Services对象模型执行其中的Finder方法和SpecificFinder方法。
请先按照上一次文章中的步骤1到5创建一个简单的Visual WebPart。并添加所需的引用和命名空间。
创建好后,按照下列步骤调用Business Connectivity Services对象模型来得到外部内容类型的方法。
1) 在你的可视化webpart的代码视图中添加下列using语句。该命名空间允许我们使用KeyValuePair类。
using System.Collections.Generic;
2)修改Page_Load方法,调用一个方法来执行外部内容类型的某个方法。
{
EnumrateAndExecuteECTMethods();
}
3)接下来,我们来定义该方法。需要做两件事:列出给定外部内容类型的所有方法;执行其中的finder方法和specific finder方法。
该方法的代码如下:
{
//获取BDC服务引用
BdcService service = SPFarm.Local.Servers.GetValue<BdcService>();
//获取元数据目录
IMetadataCatalog catalog = service.GetDatabaseBackedMetadataCatalog(SPServiceContext.Current);
//通过相应的命名空间和名称获取实体
IEntity entity = catalog.GetEntity("http://sp2010u", "产品");
Literal1.Text = "<h1>" + entity.Name + " 的方法</h1> " + "<br/>";
//为Finder和SpecificFinder方法的调用准备些变量
int finderMethodRecordsCount = 0;
string strName = "";
//获取方法集合
foreach (KeyValuePair<string,IMethod> method in entity.GetMethods())
{
//显示方法名
Literal1.Text += method.Key + ",";
//显示当前方法的实例
IMethodInstance methodInstance = method.Value.GetMethodInstances()[method.Key];
if (methodInstance.MethodInstanceType == MethodInstanceType.Finder)
{
//调用Finder方法
IEntityInstanceEnumerator ieie = entity.FindFiltered(method
.Value.GetFilters(methodInstance), entity.GetLobSystem().GetLobSystemInstances()[0].Value);
//返回结果计数
while (ieie.MoveNext())
{
finderMethodRecordsCount++;
}
}
//调用SpecificFinder方法
if (methodInstance.MethodInstanceType == MethodInstanceType.SpecificFinder)
{
//标识符的值
int i = 1;
//创建一个标识符
Identity identity = new Identity(i);
//调用SpecificFinder方法,获取该实体的实例
IEntityInstance entInstance = entity.FindSpecific(identity, entity.GetLobSystem()
.GetLobSystemInstances()[0].Value);
//显示SpecificFinder所返回的实体实例的Name字段值
strName = entInstance["Name"].ToString();
}
}
Literal1.Text += "<br/>Finder 方法获取的记录数 = " + finderMethodRecordsCount.ToString();
Literal1.Text += "<br/>Specific Finder方法返回的实例的Name为 " + strName;
}
接下来,我们对其中重点的行进行单独解释,以便了解更多细节。
4)通过Business Connectivity Services对象模型,我们首先需要获得BdcService以及元数据目录 ,然后才是外部内容类型。
在本例中我们使用产品ECT,其命名空间为http://sp2010u。
//获取BDC服务引用
BdcService service = SPFarm.Local.Servers.GetValue<BdcService>();//获取元数据目录
IMetadataCatalog catalog = service.GetDatabaseBackedMetadataCatalog(SPServiceContext.Current);
//通过相应的命名空间和名称获取实体
IEntity entity = catalog.GetEntity("http://sp2010u", "产品");
5)有了产品外部内容类型后,就可以遍历该ECT所有可用的方法了。
IEntity的GetMethods方法返回一个KeyValuePare<string,IMethod>集合,其中Key为方法的名称,IMethod为方法本身。
//获取方法集合foreach (KeyValuePair<string,IMethod> method in entity.GetMethods())
{
//显示方法名
Literal1.Text += method.Key + ",";
6)在得到可用的方法后,我们需要检查MethodInstanceType的值,判断方法的类型:
//显示当前方法的实例
IMethodInstance methodInstance = method.Value.GetMethodInstances()[method.Key];
if (methodInstance.MethodInstanceType == MethodInstanceType.Finder)
{
7)如果是Finder方法的话我们要执行它,然后简单的遍历一下返回的记录并得到记录的数量。
可以调用IEntity的FindFiltered方法来执行finder方法。
FindFiltered方法的第一个参数是筛选器的集合,可以通过调用IMethod的GetFilters方法获得,然后作为参数传给该方法实例。
FindFiltered方法的第二个参数是相应的LOB(Line Of Business,企业核心业务系统)系统的实例,可以通过IEntity的GetLobSystem方法,然后再调用 GetLobSystemInstance就可以获得。所有这些调用完成后,我们就可以循环遍历所返回的enumerator,并使记录计数器自增。
//调用Finder方法IEntityInstanceEnumerator ieie = entity.FindFiltered(method
.Value.GetFilters(methodInstance), entity.GetLobSystem().GetLobSystemInstances()[0].Value);
//返回结果计数
while (ieie.MoveNext())
{
finderMethodRecordsCount++;
}
8)对于得到的SpecificFinder方法,调用它的方法有一点不同。因为SpecificFinder方法总是要求传递至少一个参数(该参数映射到标识符)。
我们需要创建一个Identity类的实例,并作为参数传给IEntity的FindSpecific方法。FindSpecifice方法的第一个参数是标识符,第二个参数是LOB系统的实例。
当FindSpecific方法执行完成后,会返回一个IEntityInstance实例。
在本例中我们硬编码了一个标识符的值(int i=1),然后只是简单的从EntityInstance中返回Name字段的值。
//标识符的值
int i = 1;
//创建一个标识符
Identity identity = new Identity(i);
//调用SpecificFinder方法,获取该实体的实例
IEntityInstance entInstance = entity.FindSpecific(identity, entity.GetLobSystem()
.GetLobSystemInstances()[0].Value);
//显示SpecificFinder所返回的实体实例的Name字段值
strName = entInstance["Name"].ToString();
9)代码编写好后,按CTRL+F5部署到你的SharePoint站点。
10)在你的SharePoint站点中编辑页面,并添加我们刚刚部署的Visual WebPart 。
该WebPart位于Custom分类下。
它会显示产品外部内容类型的方法名,调用Finder方法后返回的记录个数,以及调用SpecificFinder方法返回的产品的名称。
参考资料
executing bcs external content type methods in c#