18

使用实体框架时,ESQL 的性能是否优于 Linq to Entities?

我更喜欢使用 Linq to Entities(主要是因为强类型检查),但我的一些其他团队成员将性能作为使用 ESQL 的理由。我想全面了解使用这两种方法的利弊。

4

6 回答 6

17

最明显的区别是:

Linq to Entities 是强类型代码,包括很好的查询理解语法。“from”位于“select”之前,这一事实允许 IntelliSense 为您提供帮助。

Entity SQL 使用传统的基于字符串的查询和更熟悉的类似 SQL 的语法,其中 SELECT 语句位于 FROM 之前。因为 eSQL 是基于字符串的,动态查询可以在运行时使用字符串操作以传统方式组成。

不太明显的关键区别是:

Linq to Entities 允许您使用“select new{...}”语法将查询结果更改或“投影”为您需要的任何形状。C# 3.0 新增的匿名类型允许这样做。

使用 Entity SQL 无法进行投影,因为您必须始终返回 ObjectQuery<T>。在某些情况下,可以使用 ObjectQuery<object>,但是您必须解决 .Select 始终返回 ObjectQuery<DbDataRecord> 的事实。请参阅下面的代码...

ObjectQuery<DbDataRecord> query = DynamicQuery(context,
        "Products",
        "it.ProductName = 'Chai'",
        "it.ProductName, it.QuantityPerUnit");

public static ObjectQuery<DbDataRecord> DynamicQuery(MyContext context, string root, string selection, string projection)
{
    ObjectQuery<object> rootQuery = context.CreateQuery<object>(root);
    ObjectQuery<object> filteredQuery = rootQuery.Where(selection);
    ObjectQuery<DbDataRecord> result = filteredQuery.Select(projection);
    return result;
}

此处此处的一位团队成员详细描述了其他更细微的差异。

于 2008-12-10T15:41:19.460 回答
3

ESQL还可以生成一些特别恶毒的sql。我不得不跟踪这样一个使用继承类的查询的问题,我发现我的 4 行的小 ESQL 被翻译成一个 100000 个字符的怪物 SQL 语句。

对 Linq 做了同样的事情,编译后的代码更易于管理,比如说 20 行 SQL。

另外,其他人提到的,Linq 是强类型,尽管如果没有编辑和继续功能进行调试非常烦人。

广告

于 2008-11-20T17:04:20.703 回答
2

Entity-SQL (eSQL) 允许您比 LINQ to Entities 更轻松地执行动态查询等操作。但是,如果您没有需要 eSQL 的场景,我会犹豫是否依赖它而不是 LINQ,因为它会更难维护(例如,不再需要编译时检查等)。

我相信 LINQ 也允许您预编译查询,这可能会给您带来更好的性能。不久前, Rico Mariani发表了关于 LINQ 性能的博客,并讨论了编译查询。

于 2008-09-02T21:38:03.530 回答
2

此处显示性能比较的漂亮图表: 实体框架性能探索 ESQL 和实体之间没有太大差异,但在使用实体而不是直接查询时总体差异显着

Entity Framework 使用两层对象映射(与 LINQ to SQL 中的单层相比),额外的映射有性能成本。至少在 EF 版本 1 中,只有在建模和 ORM 映射功能可以证明该成本合理时,应用程序设计人员才应选择实体框架。

于 2009-05-14T16:12:42.510 回答
1

您可以通过编译时检查为我覆盖的代码越多,我会比性能更重视。话虽如此,在这个阶段我可能会倾向于 ESQL,不仅仅是因为它的性能,而且它(目前)在它可以做的事情上更加灵活。没有什么比使用没有您真正需要的功能的技术堆栈更糟糕的了。

实体框架不支持自定义属性、自定义查询(当您需要真正调整性能时),并且与 linq-to-sql 的功能不同(即有些功能在实体中根本不起作用框架)。

我个人对实体框架的印象是有很大的潜力,但它的实现可能有点“僵化”,以便在当前状态下用于生产环境。

于 2008-09-02T01:33:45.343 回答
0

对于直接查询,我使用 linq to entity,对于动态查询,我使用 ESQL。也许答案不是非此即彼,而是和/也。

于 2009-05-28T18:20:40.830 回答