【问题标题】:LINQ to SQL and Dynamics CRM 2011 data views and paging VERY SLOWLINQ to SQL 和 Dynamics CRM 2011 数据视图和分页非常慢
【发布时间】:2011-07-31 04:16:25
【问题描述】:

作为访问 Dynamics CRM 2011 数据和自定义搜索条件的最佳方式,我不知所措。我正在移植一个使用联系人数据库和表单安全性的网站。联系人已移至 Dynamics CRM 2011,因此我使用 CRM 2011 SDK 和早期绑定连接到 CRM 以检索数据。我使用了代码生成工具 CrmSvcUtil.exe。 我正在使用 LINQ 构建一个从联系人集中选择到 ContactViewDefault 类的查询:

IQueryable<ContactViewDefault> query = from c in orgContext.ContactSet
                                                select new ContactViewDefault
                                                {
                                                    Username = c.EMailAddress1 ?? "",
                                                    Title = c.Salutation ?? "",
                                                    Firstname = c.FirstName ?? "",
                                                    Lastname = c.LastName ?? "",
                                                    Organisation = "",
                                                    Position = c.JobTitle ?? "",
                                                    Phone = c.Telephone1 ?? "",
                                                    Mobile = c.MobilePhone ?? "",
                                                };

PagedDataSource pagedData = new PagedDataSource();
        pagedData.AllowCustomPaging = true;
        pagedData.AllowPaging = true;
        pagedData.PageSize = 10;
        pagedData.CurrentPageIndex = 1;
        pagedData.DataSource = query;

如果我然后数据绑定到“用户名”

<%# DataBinder.Eval(Container.DataItem, "Username")%>

我收到错误消息:“ContactViewDefault”不包含名为“用户名”的属性。 另外,不支持调用 query.Count()。

然后我尝试使用 CopyToDataTable 代码(请参阅:http://msdn.microsoft.com/en-us/library/bb669096.aspx)复制到数据表,然后使用我现有的中继器和分页。 问题是代码非常慢。填充数据表可能需要大约 3 分钟。表中有 7000 条记录。

我已经尝试过http://www.dotnetcurry.com/ShowArticle.aspx?ID=345 中描述的自定义分页,

query.OrderBy(c => c.Username);
query.Take(10);
query.Skip(0);

选择前 10 条记录,但仍然需要 20 多秒才能填充一个基本中继器。 相比之下,原始代码可以将所有数据选择到分页数据源中,并在不到一秒的时间内显示第一页。

所以我遇到了几个问题,我问我是否正确地处理了这个问题。 我有更多的页面要转换,包含更复杂的查询和连接,所以我想走上正确的道路。

【问题讨论】:

    标签: performance linq-to-sql pagination dynamics-crm


    【解决方案1】:

    在我看来,您正在检索所有联系人,创建 7000 ContactViewDefault 对象并通过它们翻页。在将它们转换为 ContactViewDefault 之前尝试检索 10 个联系人(使用分页)。

    【讨论】:

    • 问题在于 CRM Org Context 不支持所有功能,而且非常臃肿。我进行了许多性能测试,但使用生成的 CRM Org Context 变得不可行。
    • 我通过为 SQL 视图创建 LINQ 数据上下文并将其用于所有选择来解决问题。在某些情况下,这些速度要快 200 倍以上。我确实为所有插入、更新和删除使用了 CRM Org Context 来维护数据库的完整性。这些都是小型操作,虽然仍然很慢,但它们是可行的。总的来说,我的结论是 CRM 非常需要带宽,这会影响性能。
    【解决方案2】:

    arch 的答案是正确的。您尝试将所有数据转换为 ContactViewDefault。如果您愿意,可以尝试使用此代码

    IQueryable<ContactViewDefault> query = (from c in orgContext.ContactSet
                                                select a).AsQuerayable();
    var data = (from c in query.Take(10)
                select new ContactViewDefault
                                                {
                                                    Username = c.EMailAddress1 ?? "",
                                                    Title = c.Salutation ?? "",
                                                    Firstname = c.FirstName ?? "",
                                                    Lastname = c.LastName ?? "",
                                                    Organisation = "",
                                                    Position = c.JobTitle ?? "",
                                                    Phone = c.Telephone1 ?? "",
                                                    Mobile = c.MobilePhone ?? "",
                                                }).ToList();
    

    如果您尝试使用此示例,请确保性能不会下降。我非常同意 CRM 中的 Linq to SQL 还不够好。但是这个基本的知识肯定很重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-18
      • 1970-01-01
      • 2014-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多