我有这个SQL语句
select st.Column1, isnull(sot.SomeColumn, 0) as SomeColumn
from SomeTable st
left join SomeOtherTable sot
在我的实体框架(4.0).edmx文件内的<DefiningQuery>
标记内,我遇到了严重的性能问题。按照编写的方式运行SQL很快,但是EF在运行时包装SQL以注入参数,这极大地降低了运行速度。
我可以拿走isnull,它在包装的EF SQL中就像它本身一样快,但我需要isnull来确保SomeColumn
有一个值。
是否有任何替代的isnull,我可以在这里使用,将很好地发挥EF?
谢谢你的帮助。
在EF设计器的属性中应该有一个默认值属性,但我不确定这是否符合您的需求。作为一种选择,从EF模型生成的所有实体都是局部的。我将添加另一个属性来包装SomeColumn属性(不带isnull),以提供默认值。考虑到someecolumn很可能被映射为一个可空的int,您可以这样定义这个新属性:
public SomeColumnWithDefaultValue {
get { return this.SomeColumn ?? 0; }
set { this.SomeColumn = value; }
}
您将编写针对someecolumn的查询,然后在需要确保它不为空的地方使用someecolumnwithdefaultvalue
我的解决方案是从我的SQL中删除所有isnull
的使用,而不是包含SELECT NEWID() AS ID
(需要这是SQL 2000+兼容)与所有这些查询。一旦我将这个ID
设置为我的单个<EntityKey>
,我就可以允许将任何左连接属性设置为isnullable=true
,并且我不再需要处理EF减速。