C# 强制EF生成强制转换SQL字符串
我需要强制实体框架使用C# 强制EF生成强制转换SQL字符串,c#,sql-server,entity-framework,linq,C#,Sql Server,Entity Framework,Linq,我需要强制实体框架使用CAST(x为varchar(10))生成SQL。一列是varchar(10),另一列是nvarchar(100) 我的LINQ看起来像这样: var results = db.User .Join(db.Stuff, u => u.MetaTag, s => s.StuffCode, (a, b) => a.StuffLongName) SELECT Stuff.StuffLongName FROM
CAST(x为varchar(10))
生成SQL。一列是varchar(10)
,另一列是nvarchar(100)
我的LINQ看起来像这样:
var results =
db.User
.Join(db.Stuff,
u => u.MetaTag,
s => s.StuffCode,
(a, b) => a.StuffLongName)
SELECT Stuff.StuffLongName
FROM User
INNER JOIN Stuff
ON CAST(User.MetaTag AS VARCHAR(10)) = Stuff.Stuffcode
;
我需要这样的SQL:
var results =
db.User
.Join(db.Stuff,
u => u.MetaTag,
s => s.StuffCode,
(a, b) => a.StuffLongName)
SELECT Stuff.StuffLongName
FROM User
INNER JOIN Stuff
ON CAST(User.MetaTag AS VARCHAR(10)) = Stuff.Stuffcode
;
如果您问我“为什么?”,当字符串不是varchar
时,SQL优化器会使用低效的计划
我试过像这样的EF模型标签
...
[Column(TypeName = "VARCHAR")]
[MaxLength(10)]
public string MetaTag
...
我唯一能做的改变是使用子字符串(MetaTag,1,30)
…但优化器并不欣赏这一点
我的备选方案看起来像一个原始SQL字符串,或者使用一个存储过程。在EF中,MaxLength注释似乎已经足够了。你认为演员阵容会对表演有什么影响?你认为什么是最有效的计划?我不知道为什么演员阵容会更好。你测试过这两种表现吗?我同意大卫的观点。这样的转变扼杀了sargability。但我相信你的话,转换表现更好,虽然对我来说这似乎是一些幸运的巧合。无论如何,不,您不能强制EF执行此操作。@zeeqzaq只需修复您的列类型以在整个过程中使用nvarchar即可