2

我有这个 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有一个值。

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

谢谢你的帮助。

4

2 回答 2

1

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

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

您将针对 SomeColumn 编写查询,然后在需要确保它不为空的地方使用 SomeColumnWithDefaultValue。

于 2011-04-13T16:05:08.193 回答
0

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

希望这可以帮助某人。

于 2011-05-02T15:45:44.413 回答