【问题标题】:EF6 Contains Query CastingEF6 包含查询转换
【发布时间】:2013-09-26 15:08:09
【问题描述】:

Edmx 文件有

<Property Name="SomePrimaryKeyID" Type="bigint" />

对应对象的属性是

<Property Type="Int64" Name="SomePrimaryKeyID" Nullable="false" />

查询:

  long[] ids = new long[]{1234567,1234568};
  var results = context.SomeEntities.Where(x=> ids.Contains(x.SomePrimaryKeyID)).ToList();

当我使用包含时,EF 生成的查询具有显式转换,例如

... WHERE SomePrimaryKeyID IN (CAST (1234567 AS BIGINT),CAST (1234568 AS BIGINT))

由于 long 对应于 bigint,我认为不需要强制转换。有什么办法可以避免这种演员表吗?

【问题讨论】:

  • 显示查询,否则无法判断演员是否可以避免
  • 感谢您的提问。也添加了查询。

标签: entity-framework ado.net-entity-data-model entity-framework-6


【解决方案1】:

对于文字整数值,SQL Server 中的默认类型是 int。因此,在您的示例中,必须始终强制转换文字值(如果没有显式强制转换,它们将是“int”类型)以匹配 SomePrimaryKeyID 的类型(即大整数)。如果缺少显式案例,Sql Server 将不得不进行隐式转换,这实际上可能更昂贵,因为它必须首先推理 SomePrimaryKeyID 的类型才能知道将文字数字转换为什么。

【讨论】:

  • 这些查询有何不同 1. "select * from SomeEntity where SomePrimaryKeyID in (9223372036854775807)" 2. "select * from SomeEntity where SomePrimaryKeyID in (CAST(9223372036854775807 AS BIGINT))"
  • 我想没有 CAST Sql Server 推断文字的类型必须是 bigint 因为列的类型(或者它将文字视为 bigint,因为它不适合 int 或两者兼而有之)。一般来说 - 为什么演员会打扰你?
  • @pawel 强制转换很重要,因为它会导致非参数化查询,这会对性能产生不利影响,因为每个查询都会获得一个新的查询计划(并且不能重用,除非具有完全相同的值)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
相关资源
最近更新 更多