Convert.ToDecimal
невозможно преобразовать в SQL при использовании его с Linq to Entities.
Вы можете создать хранимую процедуру, которая запрашивает данные, чтобы вы могли выполнять любые операции, которые не могут быть выполнены EF.
Другим решением является создание вычисляемого столбца.
Сначала , добавьте новое свойство.Назовите его SerialId
в вашей SerialNumber
сущности.
Секунда . Украсьте это свойство аннотацией данных:
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
или используйте свободную конфигурацию, если выwant:
modelBuilder.Entity<SerialNumber>().Property(t => t.SerialId)
.HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed);
Третий , добавить новую миграцию EF и в сгенерированный файл миграции, просто обновить его, передав новое значение в параметр defaultValueSql
, указанный ниже:
public override void Up()
{
AddColumn(
"dbo.SerialNumber",
"SerialId",
c => c.Int(nullable: false, defaultValueSql: "CAST(SUBSTRING(SerialNo, 11, 4) AS INT)"));
}
В модификации говорится, что в каждой строке таблицы SerialNumber
есть сгенерированный столбец, и его значение вычисляется с помощью этого оператора SQL => CAST(SUBSTRING(SerialNo, 11, 4) AS INT)
Вы можете обновить базу данных, выполнив команду ef=> update-databse
.
Наконец , вы можете изменить свой Linq на Entities, как показано ниже, и вам не нужно конвертировать:
var records = context.SerialNumbers.Where(m => m.SerialId > 20).ToList();