tinyint列的生成查询将CAST引入int

Bel*_*ate 15 c# sql-server entity-framework

我正在查询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?或者我做错了什么?

提前致谢.

Mic*_*pus 11

如果您使用IList<T>.ContainsList<byte>实体框架不会投.

List<byte> byteValue = new List<byte> { 6 };
var entityList = from r in rep.DataContext.FooTable
             where byteValue.Contains(r.TinyintColumn)
             select r;
Run Code Online (Sandbox Code Playgroud)

我遇到了同样的问题并写了博客.


shl*_*miw 5

我的同事在Entity Framework 4.0上找到了解决这个问题的非常好的技巧.
适用于smallint,我没试过tinyint.

Insals of equals(==) - 使用通过EF 4.0实现的Contains()运算符.

例如:
假设您有SmallIntColumn列.

代替:

short shortValue = 6;
var entityList = from r in rep.DataContext.FooTable
                 where r.SmallIntColumn == shortValue
                 select r;
Run Code Online (Sandbox Code Playgroud)

使用

short[] shortValue = new short[] { 6 };
var entityList = from r in rep.DataContext.FooTable
                 where shortValue.Contains(r.SmallIntColumn)
                 select r;
Run Code Online (Sandbox Code Playgroud)

检查生成的SQL - 它现在没有CAST!
从我的测试 - 执行计划完全使用列上的我(过滤)索引.

希望它有所帮助.
施洛米