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 documentmento представляет собой строку. Соответствующее поле в таблице базы данных - это varchar (50). цифраОригинал также является строкой.
и этот код для 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
}