【发布时间】:2019-07-31 23:03:58
【问题描述】:
EF 正在创建一个接收 int 作为参数的查询。它应该是一个 varchar。
我有这个生成表达式的 C# 代码
Expression<Func<Documento, bool>> query = (t => (string)t.NumeroDocumento.ToString() == (string)numeroOriginal.ToString());
var documento = documentoRepository.Obter(query, propriedadesIncluidas: "PapelPessoa.Pessoa");
Documento.Numero documento 是一个字符串。数据库表中的对应字段是 varchar(50)。 numeroOriginal 也是一个字符串。
以及存储库中的 obter (get) 代码
private T Obter(Expression<Func<T, bool>> filtro, string propriedadesIncluidas)
{
IQueryable<T> query = dbSet;
if (filtro != null)
query = query.Where(filtro);
if (!string.IsNullOrWhiteSpace(propriedadesIncluidas))
{
foreach (var includeProperty in propriedadesIncluidas.Split
(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries))
query = query.Include(includeProperty);
}
return query.FirstOrDefault();
}
当 EF 创建 sql 查询时,它会创建这个查询(从调试器获得)
SELECT [Extent1].[id] AS [id], [Extent1].[numero_documento] AS [numero_documento],
-- Removed for clariry
FROM [dbo].[DOCUMENTO] AS [Extent1]
WHERE [Extent1].[numero_documento] = (CASE WHEN (@p__linq__0 IS NULL) THEN N'' ELSE @p__linq__0 END)
在参数被替换后,这将转换为
SELECT [Extent1].[id] AS [id], [Extent1].[numero_documento] AS [numero_documento],
-- Removed for clariry
FROM [dbo].[DOCUMENTO] AS [Extent1]
WHERE [Extent1].[numero_documento] = 47837
正确的查询应该是
SELECT [Extent1].[id] AS [id], [Extent1].[numero_documento] AS [numero_documento],
-- Removed for clariry
FROM [dbo].[DOCUMENTO] AS [Extent1]
WHERE [Extent1].[numero_documento] = '47837'
两者都有效,但第二个比第一个快得多(我的意思是很多)。我都在 SQL 管理工作室中运行。 EF 获取参数类型错误?我该如何解决?我需要更改代码或数据库吗?我对表的 EF 配置是否错误?
这是 EF 对象:
[Table("DOCUMENTO")]
public class Documento : EntidadeBase
{
[Column("numero_documento", TypeName = "varchar")]
[Display(Name = "Numero")]
public string NumeroDocumento { get; set; }
// removed for clarity
}
这是桌子
CREATE TABLE [dbo].[DOCUMENTO](
[id] [int] IDENTITY(1,1) NOT NULL,
[numero_documento] [varchar](50) NULL,
-- removed for clarity
}
【问题讨论】:
-
“参数被替换后”是什么意思?参数不会被替换,它们被用作变量。
@p__linq__0参数的类型应为varchar或nvarchar,=@p__linq__0等效于='47837'或=N'47837',而不是=47837。该问题应该与参数嗅探或nvarchar到varchar的转换有关。尝试在DbContext派生类构造函数中设置this.Configuration.UseDatabaseNullSemantics = true;。
标签: c# sql-server entity-framework