越来越怪异行为使用LINQ从Microsoft CRM检索数据时(Getting weird beh

2019-10-20 10:45发布

我在访问使用LINQ联系人实体这个问题。

我有以下2种功能。

如果我跑了第一个功能,然后调用:第二个,我似乎缺少了许多在第二查询字段。 就像名字和姓氏都没有显示出来。 他们只是显示为空值。 如果我对自己跑第2个功能,我得到正确的数据。 那正确地显示了在两个运行的唯一字段标识,使用ContactID和new_username。

如果我对自己跑第2个功能,我得到正确的数据。

任何想法我究竟做错了什么?

非常感谢

以下是2层的功能

    public List<String> GetContactsUsernameOnly()
    {
        IQueryable<String> _records = from _contactSet in _flinsafeContext.ContactSet
                                       where
                                           _contactSet.new_FAN == "username"
                                       orderby _contactSet.new_username
                                       select _contactSet.new_username;

        return _records.ToList();
    }

    public List<Contact> GetContacts()
    {
        IQueryable<Contact> _records = from _contactSet in _flinsafeContext.ContactSet
                                       where
                                           _contactSet.new_FAN == "my-username-here"
                                       orderby _contactSet.new_username
                                       select _contactSet;

        return _records.ToList();
    }

Answer 1:

这是因为你重复使用相同的CRM背景下,当你调用两种方法(在你的情况_flinsafeContext)

什么情况下所做的是缓存记录,因此第一种方法将返回您的联系而只是带回new_username场。

第二种方法要返回全程记录,但是当它是第一个被称为后记录已经存在的背景下,所以它只是返回的是,尽管仅具有填充一个字段。 这是不够聪明的懒加载尚未填充的字段。 如果此方法首先称,它不会在上下文存在,因此将返回整个记录。

有两种方法来解决这个问题:

1)不要重复使用CRMContexts。 相反,创建一个基于单IOrganizationService在每个方法一个新的。

2)在你的上下文ClearChanges()方法,这将意味着你做一个查询将返回到CRM,让你所选择的领域的下一次。 这也将清除所有未保存的创建/更新/删除等,所以你必须要围绕上下文处于什么状态小心。

顺便说一句,创建一个新的CRM上下文不是一个密集的操作,所以它不是常常值得传球周围环境和重用他们。 它创建的基本OrganisationService是最慢一点。

这种行为可以如此痛苦的,因为它是可怕的低效和缓慢的,所以你想成为只选择你想为每个查询的字段返回全部记录。



Answer 2:

这里是你如何回到你想要的字段:

IEnumerable<ptl_billpayerapportionment> bpas = context.ptl_billpayerapportionmentSet
.Where(bm => bm.ptl_bill.Id == billId)
.Select(bm => new ptl_billpayerapportionment()
{
    Id = bm.Id,
    ptl_contact = bm.ptl_contact
})

这将确保一个更小的SQL语句将针对背景下,作为标识和ptl_contact执行是返回的只有两个字段。 但正如上面奔说,对在同样的情况下相同的实体进一步检索将返回不包含在初始选择字段空值(根据OP的问题)。

奖励积分,使用IEnumerable和创建一个新的,轻量级的,实体的,您可以访问常用的LINQ方法,例如。任何(),.SUM()等。CRM SDK不喜欢使用它们针对VAR的数据集,显然。



文章来源: Getting weird behavior when retrieving data from Microsoft CRM using LINQ