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

Wcf LightSwitch-使用域服务将所有请求批量加载到一个请求中,wcf,wcf-ria-services,visual-studio-lightswitch,domainservices,Wcf,Wcf Ria Services,Visual Studio Lightswitch,Domainservices,我需要对SQL Server数据库中的一些数据进行分组,因为LightSwitch不支持开箱即用,所以根据Eric Erhardt的说法,我使用域服务 但是,我的表包含几个外键,当然我希望表中显示正确的相关数据(就像指南中那样做只会显示键值)。我通过向新创建的实体添加关系来解决此问题,如下所示: public class AzureDbTestReportData : DomainService { private CountryLawDataDataObjectCont

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

但是,我的表包含几个外键,当然我希望表中显示正确的相关数据(就像指南中那样做只会显示键值)。我通过向新创建的实体添加关系来解决此问题,如下所示:

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; }
    }
}

我的域服务类如下所示:

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; }
    }
}
公共类AzureDbTestReportData:DomainService
{
私有CountryLawDataObjectContext上下文;
公共CountryLawDataObjectContext上下文
{
得到
{
if(this.context==null)
{
EntityConnectionStringBuilder=新的EntityConnectionStringBuilder();
元数据=
“res://*/CountryLawDataData.csdl | res://*/CountryLawDataData.ssdl | res://*/CountryLawDataData.msl”;
builder.Provider=“System.Data.SqlClient”;
builder.ProviderConnectionString=
WebConfiguration Manager.ConnectionString[“CountryLawDataData”]。ConnectionString;
this.context=新的CountryLawDataObjectContext(builder.ConnectionString);
}
返回这个.context;
}
}
/// 
///重写计数方法以使分页正常工作
/// 
受保护的覆盖整数计数(IQueryable查询)
{
返回query.Count();
}
[查询(IsDefault=true)]
公共IQueryable GetRuleEntryTest()
{
返回this.Context.RuleEntries
.选择(g=>
新规则EntryTest()
{
Id=g.Id,
国家,国家,
BaseField=g.BaseField
});
}
}
公共类RuleEntryTest
{
[关键]
公共int Id{get;set;}
公共字符串国家{get;set;}
公共int基域{get;set;}
}
}
它可以正常工作,国家名称和基本字段都会加载自动完成框,但这需要很长时间。对于两列,加载一页需要5-10秒。。我还有10个专栏还没有实现

之所以需要这么长时间,是因为每个相关数据(每个国家和基本字段)都需要一个请求。在Fiddler中加载页面的方式如下所示:

这是完全不可接受的,它应该是一种将所有这些调用组合成一个调用的方法,就像加载同一个表而不通过域服务时所做的那样

所以。。这是一个很好的解释,我的问题是:是否有任何方法可以让所有相关的数据一次加载或通过任何其他方式提高性能?加载屏幕不应超过10秒


感谢您的帮助或意见!与不使用相比,我的RIA服务查询速度非常快,即使在进行聚合时也是如此。这可能是因为您使用的是“虚拟关系”(通过表之间的虚线可以看出),这是您使用RuleEntryTest实体创建的

为什么在开始创建RIA实体之前,您的原始规则条目实体与LightSwitch中的国家/地区和基本单位都不相关

我没有使用Fiddler来查看发生了什么,但我会尝试创建“真实”关系,而不是“虚拟”关系,看看这是否有助于您的RIA实体的性能