我有这个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配合使用吗?
感谢您的帮助。
答案 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减速。
希望这有助于某人。