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>.Contains了List<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)
我遇到了同样的问题并写了博客.
我的同事在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!
从我的测试 - 执行计划完全使用列上的我(过滤)索引.
希望它有所帮助.
施洛米
| 归档时间: |
|
| 查看次数: |
7251 次 |
| 最近记录: |