Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 强制EF生成强制转换SQL字符串_C#_Sql Server_Entity Framework_Linq - Fatal编程技术网

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即可