Linq查询和optionSet标签​​,缺少格式化值

时间:2014-03-21 04:19:46

标签: dynamics-crm-2011 dynamics-crm-2013

我正在做一个简单的查询linq来从optionSet中检索标签。看起来缺少选项集的格式化值。有人知道为什么没有生成?

最好的问候

3 个答案:

答案 0 :(得分:2)

对于不清楚的帖子抱歉。我发现了这个问题,以及缺少密钥作为formattedvalue的原因。

问题在于您检索属性的方式。有了这个查询:

var invoiceDetails = from d in xrmService.InvoiceSet      
                     where d.InvoiceId.Value.Equals(invId)
                     select new
                     {
                         name = d.Name,
                         paymenttermscode = d.PaymentTermsCode
                     }

我正在检索选项集的正确int值,但我需要的只是文本。我用这种方式更改了查询:

var invoiceDetails = from d in xrmService.InvoiceSet         
                     where d.InvoiceId.Value.Equals(invId)
                     select new
                     {
                         name = d.Name,
                         paymenttermscode = d.FormattedValues["paymenttermscode"]
                     }

在这种情况下,我收到一条错误消息,指出密钥不存在。经过多次尝试,我试图传递键值和选项集文本,并且该尝试工作得很好。

var invoiceDetails = from d in xrmService.InvoiceSet                        
                     where d.InvoiceId.Value.Equals(invId)
                     select new
                     {
                         name = d.Name,
                         paymenttermscode = d.PaymentTermsCode,
                         paymenttermscodeValue = d.FormattedValues["paymenttermscode"]
                     }

我的猜测是,要检索与该选项​​集关联的正确文本,在该特定实体中,您还需要检索int值。 我希望这会有所帮助。

最好的问候

答案 1 :(得分:0)

由于一些原因,你的问题相当混乱。当你说你试图从OptionSet"检索标签时,我会假设你的意思。是因为您试图获取特定OptionSetValue的文本值,并且您没有直接查询OptionSetMetadata以检索实际的LocalizedLabels文本值。我还假设"选项集的格式化值缺失"是指FormattedValues集合。如果这些假设是正确的,我建议您:CRM 2011 - Retrieving FormattedValues from joined entity

答案 2 :(得分:-1)

必须查询选项集元数据。

这是我写的扩展方法:

public static class OrganizationServiceHelper
{
    public static string GetOptionSetLabel(this IOrganizationService service, string optionSetName, int optionSetValue)
    {
        RetrieveOptionSetRequest retrieve = new RetrieveOptionSetRequest
        {
            Name = optionSetName
        };
        try
        {
            RetrieveOptionSetResponse response = (RetrieveOptionSetResponse)service.Execute(retrieve);
            OptionSetMetadata metaData = (OptionSetMetadata)response.OptionSetMetadata;
            return metaData.Options
                .Where(o => o.Value == optionSetValue)
                .Select(o => o.Label.UserLocalizedLabel.Label)
                .FirstOrDefault();
        }
        catch { }
        return null;
    }
}

RetrieveOptionSetRequest和RetrieveOptionSetResponse位于Microsoft.Xrm.Sdk.Messages上。

这样称呼:

string label = service.GetOptionSetLabel("wim_continent", 102730000);

如果您要多次查询相同的选项集,我建议您编写一个返回OptionSetMetadata而不是标签的方法;然后在本地查询OptionSetMetadata。多次调用上述扩展方法将导致反复执行相同的查询。