关于动态 crm 2011:Linq 查询和选项集标签,缺少格式化值

Linq queries and optionSet labels, missing formatted value

我正在执行一个简单的查询 linq 以从选项集中检索标签。似乎缺少选项集的格式化值。有人知道为什么没有生成吗?

最好的问候


抱歉,不清楚的帖子。我发现了问题,以及作为 formattedvalue 丢失键的原因。

问题在于您检索属性的方式。使用此查询:

1
2
3
4
5
6
7
var invoiceDetails = from d in xrmService.InvoiceSet      
                     where d.InvoiceId.Value.Equals(invId)
                     select new
                     {
                         name = d.Name,
                         paymenttermscode = d.PaymentTermsCode
                     }

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

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

在这种情况下,我遇到了一个错误,指出密钥不存在。经过多次尝试,我尝试同时传递键值和选项集文本,并且该尝试效果很好。

1
2
3
4
5
6
7
8
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 值。
我希望这会有所帮助。

最好的问候


由于几个原因,您的问题相当令人困惑。我将假设您说您尝试"从 OptionSet 检索标签"时的意思是您尝试获取特定 OptionSetValue 的文本值并且您不会直接查询 OptionSetMetadata 来检索实际的 LocalizedLabels 文本值。我还假设"缺少选项集的格式化值"是指 FormattedValues 集合。如果这些假设是正确的,我建议您参考:CRM 2011 - Retrieving FormattedValues fromjoined entity


必须查询选项集元数据。

这是我写的一个扩展方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 上。

这样称呼它:

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

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