c# – CTP5 EF Code First vs. Linq-to-sql

好吧,我知道我必须在这里做错事,因为我得到的表现时间是如此不同,令人震惊.我一直在考虑在我现有的项目中使用实体的代码优先选项,所以我一直在尝试进行一些性能测试,看它是如何比较的.我正在使用MSpec对远程开发数据库运行测试.

这是我的测试:

public class query_a_database_for_a_network_entry_with_linq : ipmanagement_object {
    protected static NetINFO.IPM_NetworkMaster result;
Because of = () => {
    var db = new NetINFODataContext();
    result = db.IPM_NetworkMasters.SingleOrDefault(c => c.NetworkID == 170553);
};

It should_return_an_ipm_networkmaster_object = () => {
    result.ShouldBeOfType(typeof(NetINFO.IPM_NetworkMaster));
};

It should_return_a_net_ou_object_with_a_networkid_of_4663 = () => {
    result.IPM_OUIDMaps.First().NET_OU.NET_OUID.ShouldEqual(4663);
};

}

public class query_a_database_for_a_network_entry_with_entity_code_first : ipmanagement_object {
    protected static NetInfo.Core.Models.CTP.IPM_NetworkMaster result;

    Because of = () => {
        NetInfo.Core.Models.CTP.NetInfoDb db = new NetInfo.Core.Models.CTP.NetInfoDb();
        result = db.IPM_NetworkMasters.SingleOrDefault(c => c.NetworkID == 170553);
    };

    It should_return_an_ipm_networkmaster_object = () => {
        result.ShouldBeOfType(typeof(NetInfo.Core.Models.CTP.IPM_NetworkMaster));
    };

    It should_return_a_net_ou_object_with_a_networkid_of_4663 = () => {
        result.NET_OUs.First().NET_OUID.ShouldEqual(4663);
    };
}

正如您从datacontext中看到的linq-to-sql我无法直接访问具有多对多关系的对象.我必须使用中间查找表.这是我喜欢的Entity框架之一.但是,当我运行这些测试时,linq测试永远不会超过4秒完成(数据库是远程的).实体测试每次耗时近8秒.不确定为什么会有这么大的差异?以下是我的POCO类和我的dbcontext的摘录:

的DbContext:

public class NetInfoDb : DbContext {
        public NetInfoDb() : base("NetINFOConnectionString") { }
        public DbSet<IPM_NetworkMaster> IPM_NetworkMasters { get; set; }
        public DbSet<IPM_NetworkType> IPM_NetworkTypes { get; set; }
        public DbSet<NET_OU> NET_OUs { get; set; }

        protected override void OnModelCreating(System.Data.Entity.ModelConfiguration.ModelBuilder modelBuilder) {
            modelBuilder.Entity<IPM_NetworkMaster>()
                  .HasMany(a => a.NET_OUs)
                  .WithMany(b => b.IPM_NetworkMasters)
                  .Map(m => {
                      m.MapRightKey(a => a.NET_OUID,"NET_OUID");
                      m.MapLeftKey(b => b.NetworkID,"NetworkID");
                      m.ToTable("IPM_OUIDMap");
                  });
        }

    }

IPM_NetworkMaster:

public class IPM_NetworkMaster {
        public int NetworkID { get; set; }
        <snip>            
        public virtual ICollection<NET_OU> NET_OUs { get; set; }

    }

NET_OU:

public class NET_OU {
        public int NET_OUID { get; set; }
        <snip>
        public virtual ICollection<IPM_NetworkMaster> IPM_NetworkMasters { get; set; }
    }

解决方法

正如大家所提到的,您需要分析您的查询.假设您正在使用sql Server,您可以调高 SQL Server Profiler并比较查询和执行计划.

与任何性能问题一样,您必须先测量.根据您的方案,您必须执行更多操作.您必须使用每种技术测量两次,并确保您将苹果与苹果进行比较.如果你可以排除正在生成sql,那么你将需要测量应用程序代码,以便可能排除那里的任何瓶颈.

我怀疑它将是生成查询.

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...