我遵循了"不要过早优化"的口头禅,并使用实体框架对我的WCF服务进行了编码.

然而,我分析了性能和实体框架太慢.(我的应用程序在大约1.2秒内处理2条消息,而我正在重新编写的(遗留)应用程序在同一时间处理5-6条消息.(传统应用程序调用存储过程来访问数据库.)

我的分析指出实体框架占用了每条消息的大部分时间.

那么,我有什么 Select ?

  • 外面有更好的怪物吗

  • 有没有办法让实体框架更快

  • 一些神秘的第三选项,可以帮助我提高服务速度.

NOTE:我的大多数数据库交互都是创建和更新.我很少 Select 和删除.

推荐答案

您应该从分析实体框架实际发出的SQL命令开始.根据您的配置(POCO,Self-Tracking Entities),有很大的优化空间.您可以使用ObjectSet<T>.ToTraceString()方法调试SQL命令(这在调试模式和发布模式之间应该没有区别).如果您遇到需要进一步优化的查询,您可以使用一些投影来向EF提供有关您试图完成的任务的更多信息.

例子:

Product product = db.Products.SingleOrDefault(p => p.Id == 10);
// executes SELECT * FROM Products WHERE Id = 10

ProductDto dto = new ProductDto();
foreach (Category category in product.Categories)
// executes SELECT * FROM Categories WHERE ProductId = 10
{
    dto.Categories.Add(new CategoryDto { Name = category.Name });
}

可替换为:

var query = from p in db.Products
            where p.Id == 10
            select new
            {
                p.Name,
                Categories = from c in p.Categories select c.Name
            };
ProductDto dto = new ProductDto();
foreach (var categoryName in query.Single().Categories)
// Executes SELECT p.Id, c.Name FROM Products as p, Categories as c WHERE p.Id = 10 AND p.Id = c.ProductId
{
    dto.Categories.Add(new CategoryDto { Name = categoryName });
}

我只是在脑海中输入了这些信息,所以这并不完全是它的执行方式,但是如果您告诉EF您所知道的关于查询的所有信息(在本例中,我们需要类别名称),EF实际上做了一些很好的优化.但这与Eager 加载(db.Products.Include("类别"))不同,因为投影可以进一步减少要加载的数据量.

.net相关问答推荐

在计算Total毫秒时,.NET TimeSpan类中是否存在错误?

";Make Async ValueTask/ValueTask方法分期分配发生了什么?

在 F# 中处理 Option - Some(null) 的好策略是什么

竖线在 PropertyGroup .csproj 文件中的含义

从删除项目时重新索引的列表中删除项目的最佳算法是什么?

IANA 到 Windows 时区映射

使用 SSH.NET 查找具有特定文件名的最新 SFTP 文件

AsyncLocal 的语义与逻辑调用上下文有何不同?

"投掷;" 是什么意思?靠自己做什么?

移位比Java中的乘法和除法更快吗? .网?

如何让 DateTimePicker 显示一个空字符串?

Winforms:Application.Exit vs Environment.Exit vs Form.Close

如何根据新的安全策略在 .Net 中发送邮箱?

DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") 返回上午时间而不是下午时间?

寻找 .NET 的命令行参数解析器

覆盖 ASP.NET MVC 中的授权属性

如何过滤具有多个条件的 Directory.EnumerateFiles?

如何从头开始以编程方式配置 log4net(无配置)

如何将 VB 项目转换为 C# 项目

多行 C# 插值字符串文字