我正在查询tinyint列,实体框架生成一个SELECT查询,该查询为此列引入了CAST到INT,即使我在WHERE子句中使用的值是字节类型.
查看模型,我的tinyint列生成的Type是byte.
看代码:
byte byteValue = 6;
var entityList = from r in rep.DataContext.FooTable
where r.TinyintColumn == byteValue
select r;
Run Code Online (Sandbox Code Playgroud)
查看生成的查询:
SELECT [Extent1].[TinyintColumn] AS [TinyintColumn] WHERE @p__linq__0 = CAST( [Extent1].[TinyintColumn] AS int)
Run Code Online (Sandbox Code Playgroud)
我对性能有严格的限制,所以我不希望任何选择中的那些CAST.
所以我的问题是,有没有办法避免这个CAST超过列tinyint?或者我做错了什么?
提前致谢.
表达式树在处理字节和短路时似乎构建了不必要的转换,它们将双方(例如二进制表达式)转换为int32.
这是我见过的一些Linq提供程序中的一个问题,每个都必须剥离这个冗余层才能获得原始表达式.(NHibernate不会删除此层并在SQL查询中创建可怕的CAST).
// no conversion
Console.WriteLine((Expression<Func<int, int, bool>>) ((s, s1) => s == s1));
// converts to int32
Console.WriteLine((Expression<Func<short, short, bool>>) ((s, s1) => s == s1));
// converts to int32
Console.WriteLine((Expression<Func<byte, byte, bool>>) ((s, s1) => s == s1));
Run Code Online (Sandbox Code Playgroud)
如果您尝试构建一个能够进行精确比较的表达式(没有转换),那么您将获得成功.
所以问题是,这种行为的原因是什么?
EDIT .net 4.0 64bit,同样适用于4.5 64bit
我正在使用Entity Framework 5,我想从Oracle 10g数据库中选择数据。问题是数据库表很大,Entity Framework生成的查询无效。我想摆脱那些CAST( [column] AS [type] )。有什么设置可以关闭它们吗?
C#代码:
var context = new APPDB();
var q = context.APP_TABLE.Where(i => i.ID == 123);
// This is how I did get the generated SQL query
var str = ((System.Data.Objects.ObjectQuery) q ).ToTraceString();
Run Code Online (Sandbox Code Playgroud)
生成的查询:
SELECT
CAST( "Extent1"."ID" AS number(10,0)) AS "C1",
"Extent1"."DESCRIPTION" AS "DESCRIPTION"
FROM "APP"."APP_TABLE" "Extent1"
WHERE (123 = ( CAST( "Extent1"."ID" AS number(10,0))))
Run Code Online (Sandbox Code Playgroud)
我想要的是生成性能更好的查询的代码:
SELECT
"Extent1"."ID" AS "C1",
"Extent1"."DESCRIPTION" AS "DESCRIPTION"
FROM "APP"."APP_TABLE" …Run Code Online (Sandbox Code Playgroud)