我们在这里有一个供应商解决方案,它使用Microsoft Dynamics CRM作为基础。该应用程序包括此自定义实体,该实体具有以下属性(截断为仅显示相关位)
关系实体(类似于值列表。就像填充下拉列表的值一样)
relationshipid (guid datatype. primary key)
description (string and sample values would include "staff" or "customer" or "visitor" and etc)
我想从实体中检索单个记录。类似的东西:
select * from relationship where description like "staff%"
我知道有一个Retrieve功能,但我需要guid才能使用它。我想模拟上面的SQL,而不必使用QueryExpression。我想要获取Entity类型的对象而不是EntityCollection,这是QueryExpression将给我的。
非常感谢:)
答案 0 :(得分:3)
除非您拥有其ID,否则SDK不提供返回单个实体的方法。但是你可以写一个扩展方法来帮助自己。
以下是我使用的内容:
/// <summary>
/// Gets the first entity that matches the query expression. Null is returned if none are found.
/// </summary>
/// <typeparam name="T">The Entity Type.</typeparam>
/// <param name="service">The service.</param>
/// <param name="qe">The query expression.</param>
/// <returns></returns>
public static T GetFirstOrDefault<T>(this IOrganizationService service, QueryExpression qe) where T : Entity
{
qe.First();
return service.RetrieveMultiple(qe).ToEntityList<T>().FirstOrDefault();
}
/// <summary>
/// Converts the entity collection into a list, casting each entity.
/// </summary>
/// <typeparam name="T">The type of Entity</typeparam>
/// <param name="col">The collection to convert</param>
/// <returns></returns>
public static List<T> ToEntityList<T>(this EntityCollection col) where T : Entity
{
return col.Entities.Select(e => e.ToEntity<T>()).ToList();
}
GetFirstOrDefault确保QE仅检索一个实体。 ToEntityList将每个实体强制转换为返回的早期绑定类型。
所以电话会是这样的:
var contact = service.GetFirstOrDefault<Contact>(qe);
答案 1 :(得分:1)
检查EntityCollection
是否包含一个元素,如果为true则返回单个元素
EntityCollection results = service...
if (results.Entities.Count == 1) {
return results.Entities[0];
}
答案 2 :(得分:0)
要添加到其他答案,即使您仍然会获得EntityCollection以返回查询表达式,您可以指定一个最高计数,以仅检索1条记录作为替代。
QueryExpression qeOpportunity = new QueryExpression();
qeOpportunity.EntityName = "opportunity";
qeOpportunity.ColumnSet = new ColumnSet(new string[] { "sp_shippingmethod_lookup", "description" });
qeOpportunity.TopCount = 1;
// Add other Conditions here with qeOpportunity.Criteria.AddCondition()....
EntityCollection ecOpportunity = service.RetrieveMultiple(qeOpportunity);
if (ecOpportunity.Entities.Count > 0)
{
string description = ecOpportunity.Entities[0].GetAttributeValue<string>("description");
EntityReference myShippingMethod = ecOpportunity.Entities[0].GetAttributeValue<EntityReference>("sp_shippingmethod_lookup");
}