在使用Entity Framework时,ESQL比Linq to Entities性能更好吗?
我更倾向于使用Linq to Entities(主要是因为强类型检查),但我的团队中的一些成员认为性能是使用ESQL的原因。我想要全面了解使用任一方法的优缺点。
在使用Entity Framework时,ESQL比Linq to Entities性能更好吗?
我更倾向于使用Linq to Entities(主要是因为强类型检查),但我的团队中的一些成员认为性能是使用ESQL的原因。我想要全面了解使用任一方法的优缺点。
最明显的区别是:
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;
}
ESQL也能生成一些特别复杂的SQL语句。我曾经需要跟踪一个使用继承类的查询问题,结果发现我的简短的4行ESQL被翻译成了一个100,000个字符的怪物SQL语句。
用Linq做同样的事情,生成的代码要容易管理得多,可以说是20行SQL。
此外,正如其他人所提到的,Linq是强类型的,尽管没有“编辑并继续”功能,调试时有些烦人。
AD
我相信LINQ也允许您预编译查询,这可能会给您更好的性能。 Rico Mariani 在博客中谈到了LINQ性能,并讨论了编译查询。
对我来说,代码中越多的可以通过编译时检查而被覆盖的部分,优先级就会更高,这比性能更重要。话虽如此,在目前阶段,我可能会倾向于使用ESQL,不仅因为它的性能更好,而且在功能上也更加灵活。没有什么比使用一个缺少你真正需要的功能的技术堆栈更糟糕的了。
实体框架不支持自定义属性、自定义查询(当您需要进行真正的性能调整时)以及不像Linq-to-SQL那样运作(即实体框架中有一些功能是不起作用的)。
我个人对实体框架的印象是,它具有很大的潜力,但在当前状态下,在生产环境中使用它可能会有点“僵化”。
对于直接查询,我使用实体框架语言集成查询(linq to entities),对于动态查询,我使用实体框架命令语言(ESQL)。也许答案不是二选一,而是并且/也。