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

时间:2011-04-13 15:57:02

标签: sql entity-framework-4 left-join isnull

我有这个SQL语句

select st.Column1, isnull(sot.SomeColumn, 0) as SomeColumn 
from SomeTable st 
left join SomeOtherTable sot 

在我的Entity Framework(4.0).edmx文件中的<DefiningQuery>标记内,我遇到了严重的性能问题。在编写时运行SQL很快,但是EF在运行时将SQL包装为注入参数,这会极大地降低它的速度。

我可以带走isnull,它在包装的EF SQL中与原生一样快,但我需要isnull来确保SomeColumn具有值。

我在这里可以使用哪种替代isnull,可以很好地与EF配合使用吗?

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

在EF设计器的属性属性中应该有一个默认值属性,我不确定它是否符合您的需求。作为替代方案,您EF模型生成的所有实体都是部分实体。我将添加另一个包装SomeColumn属性(没有isnull)的属性来提供默认值。鉴于SomeColumn可能会被映射为可以为null的int,您可以像这样定义新属性:

public SomeColumnWithDefaultValue {
    get { return this.SomeColumn ?? 0; }
    set { this.SomeColumn = value; }
}

您可以针对SomeColumn编写查询,然后使用SomeColumnWithDefaultValue来确保它不是null。

答案 1 :(得分:0)

我的解决方案是从我的SQL中完全删除isnull的所有使用,而是包含SELECT NEWID() AS ID(需要这与SQL 2000+兼容)以及所有这些查询。将ID设置为单<EntityKey>后,我可以将任何左连接属性设置为isnullable=true,我不再需要处理EF减速。

希望这有助于某人。