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) ", и этот метод не может быть переведен в выражение хранилища.
Где проблема?
Ответы
Ответ 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);