2011-09-13 116 views
3

在CRM 2011中,我可以使用EarlyBoundEntities执行通常的创建,更新和删除操作。然而,我不能找到一个使用相同类型的代码检索实体列表的例子。有没有使用EarlyBoundEntities检索类型项目列表的方法?检索实体列表

我已经通过MSDN看了,我能找到的是如何检索一个实体,如果我知道它的GUID已经。

// Retrieve the account containing several of its attributes. 
ColumnSet cols = new ColumnSet(
       new String[] { "name", "address1_postalcode", "lastusedincampaign" }); 

Account retrievedAccount = (Account)_service.Retrieve("account", _accountId, cols); 
Console.Write("retrieved, "); 

我将如何获取所有没有电话号码的账户列表?

回答

6

如果您使用servicecontextname参数生成了早期绑定的代理类,那么您可以使用LINQ进行查询。否则,如果您仍想使用QueryExpression等其他查询方法,则可以使用LINQ将所有实例都转换为期望的早期绑定类型。

var contacts = service.RetrieveMultiple(new QueryExpression 
              { 
               EntityName = "contact", 
               ColumnSet = new ColumnSet("firstname") 
              }) 
    .Entities 
    .Select(item => item.ToEntity<Contact>()); 

你也可以使用一个扩展方法,如果你宁愿:

public static IEnumerable<T> RetrieveMultiple<T>(this IOrganizationService service, QueryBase query) where T : Entity 
{ 
    return service.RetrieveMultiple(query) 
     .Entities 
     .Select(item => item.ToEntity<T>()); 
} 

用法:

var contacts = service.RetrieveMultiple<Contact>(new QueryExpression 
                 { 
                  EntityName = "contact", 
                  ColumnSet = new ColumnSet("firstname") 
                 }); 
+0

第一个例子就是我以后的样子。其他人基本上(对我)减损早绑定实体的好处,因为我必须将实体的名称编码为字符串,并且只有在属性/实体发生更改时才会在运行时生成错误,第一个示例会给出编译时错误,如果我改变了属性/实体。 – Mauro

1

在MSDN上的SDK中实际上有很多材料显示如何查询实体。

Create Queries to Retrieve Data

Build Queries with LINQ - 主要是早期绑定例子

的API提供了三种或多或少等价的方法来查询数据库(LINQ,FetchXml,和QueryExpression),虽然有一些限制(例如,请参阅LINQ limitations),您只能通过使用本地安装和本地SQL调用来解决问题。

对于您给出的具有空电话号码的帐户的示例,三种支持的查询方法中的任何一种都可以使用。

+0

@Luke我想这是链接到包含信息的LINQ页关于特定的早期实体。 '“如果在使用代码生成工具(CrmSvcUtil.exe)时指定使用servicecontextname参数的类的名称,则使用早期绑定的编程类时,可以生成从OrganizationServiceContext类派生的类。允许引用使用模式<实体模式名称> + Set的IQueryable实体集,例如AccountSet引用帐户实体记录集合。“ 我将编辑答案以包含此内容。 –