实体框架定义查询+ IsNull +左连接=方式太慢



我有这个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减速。

最新更新