Я использую EntityFramework 6.3.0 в .Net 4.7.2 У меня есть этот код в C #
int userId = 1;
string statusValue = StatusCodes.Failing; // This is a string for anyone wondering, not an Enum
return (from statusRow in DbContext.Statuses
where statusRow.UserId == userId
&& statusRow.Status == statusValue
&& statusRow.Times > 0
orderby statusRow.CreatedAtDateTimeOffset descending
select statusRow).FirstOrDefault();
EntityFramework генерирует этот запрос
DECLARE @p__linq__0 int = 1;
DECLARE @p__linq__1 nvarchar = 'Failing';
SELECT TOP (1)
[Project1].[Id] AS [Id],
[Project1].[UserId] AS [UserId],
[Project1].[Times] AS [Times],
[Project1].[CreatedAtDateTimeOffset] AS [CreatedAtDateTimeOffset],
[Project1].[Status] AS [Status],
FROM ( SELECT
[Extent1].[Id] AS [Id],
[Extent1].[UserId] AS [UserId],
[Extent1].[Times] AS [Times], sOverridden],
[Extent1].[CreatedAtDateTimeOffset] AS [CreatedAtDateTimeOffset],
[Extent1].[Status] AS [Status],
FROM [dbo].[Statuses] AS [Extent1]
WHERE ([Extent1].[UserId] = @p__linq__0) AND (([Extent1].[Status] = @p__linq__1) OR (([Extent1].[Status] IS NULL) AND (@p__linq__1 IS NULL))) AND ([Extent1].[Times] > 0)
) AS [Project1]
ORDER BY [Project1].[CreatedAtDateTimeOffset] DESC
Проблема заключается во второмстрока, где он объявляет p__linq_1. Он устанавливает тип nvarchar, для которого сервер sql по умолчанию имеет длину 1 символ. Из-за этого запрос не возвращает записей, когда есть записи, которые он должен найти. Столбец Состояние в модели определяется как
[StringLength(50)]
public string Status { get; set; }
[ForeignKey("Status")]
public virtual xStatus StatusValue { get; set; }
Я также пробовал MaxLength (50) вместо StringLength. Но сгенерированный запрос остается тем же.
Кто-нибудь знает, как это исправить?
Обновление: это может быть той же проблемой, что и Проблема соответствия строк в платформе Entity. Работает для строкового литерала, но не для строковой переменной
Но использование строки. Сравнение, указанное в этом билете, также не работает.
После дальнейшей отладки на моей сторонеЯ обнаружил, что это была ошибка пользователя, а не проблема в Entity Framework.