LINQ to Entities не распознает метод "Int32 Parse (System.String)" при попытке проанализировать столбец для сравнения неравенств - программирование
Подтвердить что ты не робот

LINQ to Entities не распознает метод "Int32 Parse (System.String)" при попытке проанализировать столбец для сравнения неравенств

У меня есть следующий код на моей странице:

var myVar= Entity.SetName
                 .Where(p => int.Parse(p.ID) >= start &&
                  int.Parse(p.ID) <= end);

start и end - int, но p.ID - строка. Поэтому я должен преобразовать p.ID в int. Но я получаю следующую ошибку:

LINQ to Entities не распознает метод 'Int32 Parse (System.String) ", и этот метод не может быть переведен в выражение хранилища.

Где проблема?

4b9b3361

Ответ 1

Во-первых, я настоятельно рекомендую проверить дизайн вашей базы данных, есть ли действительно веская причина для ID быть string. Я бы подумал об изменении типа DB ID на int, и вы избавитесь от этой проблемы при преобразовании.

Полученная вами ошибка означает, что EF не знает, как преобразовать метод Int32.Parse() в SQL. В принципе у вас есть два варианта, как с этим бороться:

Выполняет сравнение вне linq с объектами:

var myVar= Entity.SetName.AsEnumerable()
                 .Where(p => int.Parse(p.ID) >= start &&
                  int.Parse(p.ID) <= end);

Но это не рекомендуется, потому что вы читаете весь набор результатов из БД, прежде чем применять условие where.

Или сделайте специальную функцию, определенную моделью, как описано в этом сообщении в SO:

Преобразование String в Int в EF 4.0 или Entity Framework: Где я могу расширить CSDL/MSL?

Ответ 2

переместить функцию синтаксиса из выражения linq.

int id = int.Parse(p.ID);
var myVar= Entity.SetName
.Where(p => id >= start && int.Parse(p.ID) <= end);

Ответ 3

Сначала попробуйте преобразовать в int, затем передайте это имя переменной

int catgry = Convert.ToInt32(customercategory.OWNERSHIP_TYPE);
var customerCateg = (from d in _db.tbl_SIL_CUSTOMER_CATEGORY_MST
    .Where(d => d.CAT_ID == catgry) select d.CAT_TYPE).SingleOrDefault();

Ответ 4

Хотя это не эффективно, вы должны иметь возможность загружать все строки, а затем использовать LINQ to Objects:

var myVar= Entity.SetName.ToList()
                 .Where(p => int.Parse(p.ID) >= start &&
                  int.Parse(p.ID) <= end);