LINQ to Entities与ESQL的性能比较

18

在使用Entity Framework时,ESQL比Linq to Entities性能更好吗?

我更倾向于使用Linq to Entities(主要是因为强类型检查),但我的团队中的一些成员认为性能是使用ESQL的原因。我想要全面了解使用任一方法的优缺点。

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

其中一位团队成员在这里详细描述了其他更微妙的差异,这里这里


3

ESQL也能生成一些特别复杂的SQL语句。我曾经需要跟踪一个使用继承类的查询问题,结果发现我的简短的4行ESQL被翻译成了一个100,000个字符的怪物SQL语句。

用Linq做同样的事情,生成的代码要容易管理得多,可以说是20行SQL。

此外,正如其他人所提到的,Linq是强类型的,尽管没有“编辑并继续”功能,调试时有些烦人。

AD


2
Entity-SQL(eSQL)使您可以更轻松地执行动态查询等操作,而不是使用LINQ to Entities。 但是,如果您没有需要eSQL的情况,我会犹豫不决地依赖它而不是LINQ,因为它将更难以维护(例如,没有更多的编译时检查等)。

我相信LINQ也允许您预编译查询,这可能会给您更好的性能。 Rico Mariani 在博客中谈到了LINQ性能,并讨论了编译查询。


2
这里有一个好的图表,展示了性能比较情况: 探究Entity Framework的性能。 在使用ESQL和Entities时,没有太大的区别,但是当使用Entities代替直接查询时,总体差异很大。
相比LINQ to SQL中的单层对象映射,Entity Framework使用两层对象映射,额外的映射会带来性能成本。至少在EF版本1中,应用程序设计人员只有在建模和ORM映射能够证明这种成本是合理的情况下,才应该选择Entity Framework。

1

对我来说,代码中越多的可以通过编译时检查而被覆盖的部分,优先级就会更高,这比性能更重要。话虽如此,在目前阶段,我可能会倾向于使用ESQL,不仅因为它的性能更好,而且在功能上也更加灵活。没有什么比使用一个缺少你真正需要的功能的技术堆栈更糟糕的了。

实体框架不支持自定义属性、自定义查询(当您需要进行真正的性能调整时)以及不像Linq-to-SQL那样运作(即实体框架中有一些功能是不起作用的)。

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


0

对于直接查询,我使用实体框架语言集成查询(linq to entities),对于动态查询,我使用实体框架命令语言(ESQL)。也许答案不是二选一,而是并且/也。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接