Преобразование Entity Framework / Linq EXpression из строки в int

У меня есть выражение вроде так:

var values = Enumerable.Range(1,2); return message => message.Properties.Any( p => p.Key == name && int.Parse(p.Value) >= values[0] && int.Parse(p.Value) <= values[1]); 

Это компилируется отлично, но когда он попадает в базу данных, он генерирует исключение. 'LINQ to Entities does not recognize the method 'Int32 Parse(System.String)' method, and this method cannot be translated into a store expression '

Если я не выполняю синтаксический parsing и значения будут string[] я не могу использовать операторы >= и <= для строк.

p.Value – это строка, которая содержит различные значения, но в этом случае она является int

Есть ли способ, с помощью которого я могу запросить базу данных, чтобы сделать это между выражением?

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

К счастью, есть временное решение, заставляя запрос выполняться LINQ для объектов, а не LINQ to Entities. К сожалению, это означает потенциальное считывание большого объема данных в память

РЕДАКТИРОВАТЬ

Исходя из ваших других комментариев, значение в столбце Значение не должно быть числом. Поэтому вам придется попробовать преобразовать значение в число, а затем обрабатывать вещи на основе отказа / успеха этого преобразования:

 return message .Properties .AsEnumerable() .Any(p => { var val = 0; if(int.TryParse(p.Value, out val)) { return p.Key == name && val >= values[0] && val <= values[1]) } else { return false; } ); 

EDIT 2

На самом деле вы можете уйти от этого в базе данных. Я не уверен, что это сработает или не для вас, но сделайте снимок:

 return message.Properties .Where(p => p.Key == name && SqlFunctions.IsNumeric(p.Value) > 0) .Any(p => Convert.ToInt32(p.Value) >= values[0] && Convert.ToInt32(p.Value) <= values[1]); 

Насколько я ненавижу этот ответ. Фактический ответ: вы не можете сделать это легко. Это будет настоящая боль. Я видел много неправильных ответов и множество ответов с людьми, говорящими, что вы должны просто иметь свои поля базы данных в правильном типе. не полезно.

Этот вопрос аналогичен http://social.msdn.microsoft.com/Forums/en-US/ce9652e3-5450-44c4-a9bd-586b4c4e6a27/convert-string-to-int-in-whereorderby-is-it-possible ? форум = adodotnetentityframework

Существует несколько возможностей в зависимости от того, какой тип EF вы используете.

1. Вы используете файлы EDMX.

(Сначала код не первый или обратный.). Вы можете использовать что-то вроде ( LINQ to Entities не распознает метод «Double Parse (System.String)», и этот метод не может быть переведен в выражение хранилища )

  [EdmFunction("PlusDomain", "ParseDouble")] public static double ParseDouble(string stringvalue) { /// This method exists for use in LINQ queries, /// as a stub that will be converted to a SQL CAST statement. return System.Double.Parse(stringvalue); } 

и карта в вашем EDMX

 >  >  >  > cast(stringvalue as Edm.Double) >  >  

2. Если вы используете код сначала в EF> = 4.1.

Вы ввернуты. Microsoft не посчитала нужным добавить любую такую ​​функцию в SqlFunctions. Лучшее, на что вы можете надеяться, – добавить скалярную функцию SQL в вашу базу данных и (возможно) попытаться сопоставить ее с вашим контекстом. В Microsoft сначала не было смысла делать что-либо подобное. К счастью, они тоже не полностью блокировали такие вещи. Fluent API является мощным.

Это будет примерно так:

Вы можете вызвать функции или хранимые процедуры следующим образом: сначала определить скалярную функцию с кодом ef4.1? или http://weblogs.asp.net/dwahlin/using-entity-framework-code-first-with-stored-procedures-that-have-output-параметры, такие как:

var outParam = новый SqlParameter («overHours», SqlDbType.Int); outParam.Direction = ParameterDirection.Output;

var data = context.Database.ExecuteSqlCommand (“dbo.sp_getNumberJobs @overHours OUT”, outParam); int numJobs = (int) outParam.Value;

но чтобы они фактически интегрировались в LinQ в сущности, вам нужно что-то большее:

https://codefirstfunctions.codeplex.com/, используя http://www.nuget.org/packages/EntityFramework.CodeFirstStoreFunctions, который отображает функции SQL в контексте, но использует внешнюю библиотеку, созданную только для .NET 4.5 http: // blog.3d-logic.com/2014/04/09/support-for-store-functions-tvfs-and-stored-procs-in-entity-framework-6-1/

или Вы можете попытаться сделать то же самое вручную с чем-то вроде:

Entity Framework 6 Code Первое отображение функции или

https://entityframework.codeplex.com/discussions/494365

или более быстрое решение, которое я решил для своих нужд, – это просто создать представление с преобразованными типами. Это позволяет избежать всей проблемы.

Недавно мне пришлось преобразовать строку (числовое представление) в значение enums в запросе LINQ без материализации запроса. В моем перечислении использовались значения int между 0 и 9, поэтому я сделал что-то вроде этого:

  .Select(str => (MyEnum?)(SqlFunctions.Unicode(str) - 48)) 

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

Вы можете попробовать Convert.ToInt32(input); Если вы не уверены, вы можете TryParse . Он не будет генерировать исключение, но false – это невозможно. Но Convert.ToInt32(input); должно сработать. Вы можете прочитать об этом на http://msdn.microsoft.com/en-us/library/vstudio/bb397679.aspx .

  • Рекурсивный запрос LINQ: выберите элемент и все дочерние элементы с дочерними элементами
  • Как использовать LINQ Distinct () с несколькими полями
  • Что означает этот код C # со «стрелкой» и как он называется?
  • Сортировка списка на основе другого списка
  • Что я могу сделать, чтобы разрешить исключение «Row not found or changed» в LINQ to SQL в базе данных SQL Server Compact Edition?
  • Рекомендации по использованию веб-приложений LINQ to SQL
  • Получение имени свойства из выражения lambda
  • Выберите все столбцы после JOIN в LINQ
  • Как преобразовать результаты linq в HashSet или HashedSet
  • Запросы журнала, выполняемые Entity Framework DbContext
  • Как использовать LINQ для выбора объекта с минимальным или максимальным значением свойства
  • Давайте будем гением компьютера.