如果我不知道GUID,如何使用c#在Microsoft CRM上检索单个记录?

时间:2014-06-19 07:38:49

标签: c# dynamics-crm-2011

我们在这里有一个供应商解决方案,它使用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将给我的。

非常感谢:)

3 个答案:

答案 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");

}