В MVC, как я могу получить записи из базы данных, соответствующие диапазону строковых серийных номеров, которые включают числа? - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть приложение MVC, которое использует Code First Entity Framework.

У меня есть записи в моей базе данных для серийных номеров, которые являются строками, и комбинацией букв и цифр. Последние 4 всегда являются числовой частью .

Я пытаюсь получить все записи в диапазоне от A до B, например, из SERIAL-NO-0020 в SERIAL-NO-0050

Я не могу преобразовать часть номера строки в целое число, поскольку Linq To Entities не поддерживает ее.Так, в качестве примера, чтобы получить все записи с серийным номером больше 20, это не работает:

var records = context.SerialNumbers.Where(m => Convert.ToDecimal(m.SerialNo.Substring(10, 4)) > 20).ToList();

Есть ли способ сделать это без предварительного извлечения всех записей из базы данных и дальнейшей фильтрации

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

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();
0 голосов
/ 25 апреля 2018

Вместо написания запросов вы можете написать SP и получить доступ к этому SP (Stored Proceure) с помощью Linq.В SP вы можете сначала разделить запись, а затем сравнить.Это также займет меньше времени и увеличит производительность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...