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

Я использую Entity Framework, и у меня есть строка кода, которая принимает var и переводит его обратно в iint для базы данных.

var record = context.enrollments.SingleOrDefault
  (row => row.userId == int.Parse(UserID) && row.classId == int.Parse(ClassID));

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

Я тоже пробовал это

 var record = context.enrollments.FirstOrDefault
  (row => row.userId == Convert.ToInt32(UserID) 
  && row.classId == Convert.ToInt32(ClassID));

и все, что я получаю, это сообщение об ошибке: "LINQ to Entities делает не распознать метод ' Int32 ToInt32 (System.String) ' метод, и этот метод не может быть переведен в выражение хранилища

и, наконец, я попробовал это, что, я знаю, необычно, но в прошлом это работало для подобных ситуаций.

var record = context.enrollments.SingleOrDefault
  (row => row.userId == CommonDLL.Sanitize<int>.ConvertType(UserID) 
  && row.classId == CommonDLL.Sanitize<int>.ConvertType(ClassID));

в котором я получаю эту ошибку. Как вы можете видеть, я пробовал разные вещи, и ничего не работает, поэтому любая помощь была бы отличной.

2 ответов


на Linq to Entity, вы должны использовать методы, в свой query, который поддерживается вашим provider преобразовать их в expression tree для запуска на вашем Data Base сторону.

все поставщики должны поддерживать некоторые методы по умолчанию называется Canonical Functions (Подробнее Здесь), а также вы можете определить свой user defined function и stored procedure as edm functions чтобы использовать linq query (Подробнее Здесь) и (здесь).

кроме того, вы можете использовать методы, которые поддерживается поставщиками и может быть преобразован в expression tree, которые в EntityFunctions и SqlFunctions.

и, наконец, о вашем вопросе, вы можете конвертировать UserID и ClassID перед вашим запросом, вот так:

var UID = int.Parse(UserID);
var CID = int.Parse(ClassID);
var record = context.enrollments.SingleOrDefault
    (row => row.userId == UID && row.classId == CID);

это работает для меня:

  var iId = int.Parse(TextBox1.Text);
 var item = db.Items.Where(p => p.ItemID == iId ).FirstOrDefault();

чтобы сделать эту работу, вы должны преобразовать значение textbox вне лямбда-выражения.