在数据库表上有一个char(2)
类型的列。
当我在linq中使用参数,例如.Where(x => x.Code == code)
时,SQL查询参数被转换为varchar(max)
,我真的希望它是char(2)
,以避免隐式转换。这是因为查询没有按照我想要的方式使用数据库的索引。
Property(c => c.Code)
.HasColumnType("char")
.IsFixedLength()
.HasMaxLength(2);
代码优先映射如上所示。唯一影响翻译的是.HasColumnType("char")
它似乎不会影响查询翻译,因为这会影响它是选择varchar(max)
还是nvarchar(max)
。
我想到了两个解决方案,一个是更改数据库,以便使用int
和查找而不是char代码,另一个是将代码转换为使用表达式。如果有更好的方法来控制映射到sql,我宁愿不做两件事。
答案 0 :(得分:0)
我找到了实现这一目标的方法。
而不是使用.Where(x => x.Code = code)
我现在正在使用
var codes = new string[] { code }
...
.Where(x => codes.Contains(x.Code))
这会在查询中转换为常量而不是参数。