LightSwitch - 使用域服务将所有请求批量加载到一个请求中

时间:2013-05-06 06:57:17

标签: wcf wcf-ria-services visual-studio-lightswitch domainservices

我需要对SQL Server数据库中的一些数据进行分组,因为LightSwitch不支持开箱即用,我根据Eric Erhardt的guide使用域名服务。

然而,我的表包含几个外键,当然我希望在表中显示正确的相关数据(只需在指南中执行,只会显示键值)。我通过向我新创建的实体添加一个关系来解决这个问题:

enter image description here

我的Domain Service类看起来像这样:

public class AzureDbTestReportData : DomainService
    {
        private CountryLawDataDataObjectContext context;
        public CountryLawDataDataObjectContext Context
        {
            get
            {
                if (this.context == null)
                {
                    EntityConnectionStringBuilder builder = new EntityConnectionStringBuilder();
                    builder.Metadata =
                      "res://*/CountryLawDataData.csdl|res://*/CountryLawDataData.ssdl|res://*/CountryLawDataData.msl";
                    builder.Provider = "System.Data.SqlClient";
                    builder.ProviderConnectionString =
                      WebConfigurationManager.ConnectionStrings["CountryLawDataData"].ConnectionString;

                    this.context = new CountryLawDataDataObjectContext(builder.ConnectionString);
                }
                return this.context;
            }
        }

        /// <summary>
        /// Override the Count method in order for paging to work correctly
        /// </summary>
        protected override int Count<T>(IQueryable<T> query)
        {
            return query.Count();
        }

        [Query(IsDefault = true)]
        public IQueryable<RuleEntryTest> GetRuleEntryTest()
        {
            return this.Context.RuleEntries
                .Select(g =>
                    new RuleEntryTest()
                    {
                        Id = g.Id,
                        Country = g.Country,
                        BaseField = g.BaseField
                    });
        }
    }

    public class RuleEntryTest
    {
        [Key]
        public int Id { get; set; }
        public string Country { get; set; }
        public int BaseField { get; set; }
    }
}

它的工作原理和所有这些,国家名称和基本字段都加载了自动填充框,但它需要很长时间。有两列,加载一页需要5-10秒......我还有10个列尚未实现。

需要这么长时间的原因是因为每个相关数据(每个Country和BaseField)都需要一个请求。加载页面在Fiddler中是这样的:

enter image description here

这根本不可接受,它应该是将所有这些调用合并为一个的方式,就像在不通过域服务的情况下加载同一个表时一样。

所以..这是很多解释,我的问题是:有什么方法可以立即加载所有相关数据或通过任何其他方式提高性能?加载屏幕不应该花费10秒以上。

感谢您的帮助或输入!s

1 个答案:

答案 0 :(得分:0)

与不使用它们相比,我的RIA服务查询非常快,即使我正在进行聚合。您可能正在使用您使用RuleEntryTest实体创建的“虚拟关系”(您可以通过表之间的虚线来判断)。

为什么您的原始 RuleEntry 实体与国家和&amp;在开始创建RIA实体之前,LightSwitch中的 BaseUnit

我没有用Fiddler来看看发生了什么,但我会尝试创建“真正的”关系,而不是“虚拟”关系,&amp;看看这是否有助于您的RIA实体的表现。