c# - CRM 2011 - 从加入的实体中检索 FormattedValues

标签 c# linq dynamics-crm-2011 early-binding

我一直在转换我的一些 CRM4.0 插件以使用 CRM2011 SDK。我刚开始使用 LINQ for Early-Bound entities 并且遇到了一个问题。

我正在尝试获取已连接实体中 OptionSetValue 的格式化值。看完this MSDN SDK Query Example ,我设法检索了主要实体的格式化值,但似乎无法将其转换为连接的实体。

下面的代码是我想要实现的示例。我首先使用 SDK 示例中的代码。

var query_join8 = (from a in sContext.AccountSet
                    join c in sContext.ContactSet
                        on a.PrimaryContactId.Id equals c.ContactId
                        into gr
                    from c_joined in gr.DefaultIfEmpty()
                    select new
                                {
                                    contact_name = c_joined.FullName,
                                    account_name = a.Name,
                                    account_addresstypecode = a.Address1_AddressTypeCode,
                                    account_addresstypename = a.FormattedValues.ContainsKey("address1_addresstypecode") ? a.FormattedValues["address1_addresstypecode"] : null,
                                    account_formattedValues = a.FormattedValues,
                                    contact_addresstypecode = c_joined.Address1_AddressTypeCode,
                                    contact_addresstypename = c_joined.FormattedValues.ContainsKey("address1_addresstypecode") ? c_joined.FormattedValues["address1_addresstypecode"] : null,
                                    contact_formattedValues = c_joined.FormattedValues,
                                }).ToArray();

account_formattedValues 和 account_addresstypename 已更正,我可以访问该数据,但出于某种原因,contact_formattedValues 项目包含一个空集合,因此 contact_addresstypename 为空。

我是不是做错了,还是错过了什么?有没有人能够或知道如何实现这一目标?非常感谢任何帮助。

最佳答案

LINQ 查询提供程序中存在一个错误,其中格式化值未正确应用于第一个实体之后的实体。它与 QueryExpression API(LINQ 提供程序使用的)如何处理连接查询有关。它通过汇集第一个/主要实体(技术上唯一的实体)中的所有属性和格式化值来实现。然后它使用一组“link aliases”对这些值进行分类。我们可以利用它作为缺少 FormattedValues 的解决方法。

var acs =
    from a in context.AccountSet
    join c in context.ContactSet on a.PrimaryContactId.Id equals c.ContactId
    into gr
    from c_joined in gr.DefaultIfEmpty()
    select new
    {
        account_addresstypecode = a.Address1_AddressTypeCode,
        account_addresstypename = a.FormattedValues["address1_addresstypecode"],
        contact_addresstypecode = c_joined.Address1_AddressTypeCode,
        contact_addresstypename = a.FormattedValues["c_0.address1_addresstypecode"],
        a.FormattedValues
    };

foreach (var ac in acs)
{
    foreach (var pair in ac.FormattedValues)
    {
        Console.WriteLine("{0} {1}", pair.Key, pair.Value);
    }
}

注意所有标签值都是从“a”参数中提取的,棘手的部分是知道别名/前缀值是什么(对于非主要实体)这是一个基于实体名称动态创建的字符串-设置参数、“c”和计数器值。这可以通过转储主要实体的 FormattedValues 来检查。

关于c# - CRM 2011 - 从加入的实体中检索 FormattedValues,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7426087/

相关文章:

c# - 提取数据库特定 id :s with the repository pattern?

c# - 如何使用linq获取字典对象的变量

c# - MS Dynamics CRM 在线 2011 - 身份验证问题

dynamics-crm-2011 - MS CRM 2011 是否需要 Active Directory

c# - 如何在 C# 中压缩具有相似文件名的多个文件

c# - FirstOrDefault 抛出 'Sequence contains more than one matching element'

c# - 按日期显示结果 ASP.NET MVC

sql - CRM 2011 中的 CRMAF 过滤

c# - Azure EventHub PartitionedSender 的重试逻辑

C#:XML 反序列化限制