在Linq查询中搜索十进制值

我有这个搜索条件

[HttpPost] public ActionResult Index(string searchString) { if (!String.IsNullOrEmpty(searchString)) { students = students.Where(s => s.FIRST_NAME.Contains(searchString) || s.LAST_NAME.Contains(searchString) || s.PERSONAL_NUMBER.Contains(searchString) || s.ACD_UNI_DEGREES.DEGREE.Contains(searchString) || s.ACD_UNI_FACULTIES.FACULTY.Contains(searchString) || s.ACD_UNI_SPECIALIZATIONS.SPECIALIZATION.Contains(searchString) || SqlFunctions.StringConvert(s.SEMESTER).Contains(searchString) || s.COR_PAYER_STATUS.NAME.Contains(searchString) || SqlFunctions.StringConvert(s.CREDIT_COUNT).Contains(searchString)); } return View(students.ToList()); } 

但在调试时抛出exception:

System.NotSupportedException:类型为“System.Data.Objects.SqlClient.SqlFunctions”的指定方法’System.String StringConvert(System.Nullable`1 [System.Decimal])’无法转换为LINQ to Entities存储表达式。

问题出在这里:

 SqlFunctions.StringConvert(s.SEMESTER).Contains(searchString) 

SEMESTER是十进制的, searchString是字符串。 我怎样才能改善这一点?

您应该确保使用System.Data.Entity.SqlServer.SqlFunctions 。 我重写了你的查询,一切正常。

虽然这是一个老问题发布答案,以便其他人会正确地做到这一点
要纠正的第一件事是我们需要将第一个整数转换为十进制然后搜索,假设可搜索列的数据类型也是十进制

所以首先将搜索字符串转换为十进制

  decimal dec; bool IsDecimal = decimal.TryParse(searchString, out dec); // Truncating search to 2 digits this should be equal to your db // column precision so that rounding case are handled properly decimal TruncateDigits = -1; if (IsDecimal) TruncateDigits = Convert.ToDecimal(Math.Truncate(dec * 100) / 100); 

现在,您的搜索字段与您的db coloumn precison相同,并准备好搜索

  students = students.Where(s => s.FIRST_NAME.Contains(searchString) || s.LAST_NAME.Contains(searchString) || s.PERSONAL_NUMBER.Contains(searchString) || s.ACD_UNI_DEGREES.DEGREE.Contains(searchString) || s.ACD_UNI_FACULTIES.FACULTY.Contains(searchString) || s.ACD_UNI_SPECIALIZATIONS.SPECIALIZATION.Contains(searchString) || (IsDecimal && (decimal.Round(s.SEMESTER, 2) == TruncateDigits)) 

重要的是要注意

  (IsDecimal && (decimal.Round(s.SEMESTER, 2) == TruncateDigits)) 

这里我们将再次舍入db列精度来处理舍入。

另外SqlFunctions.StringConvert会在内部进行舍入,所以如果你的数字是db是68.88并且你正在搜索它不会搜索68因为StringConvert会给你69(舍入)所以如果你想搜索68然后你需要使用Floor函数
就像是

  SqlFunctions.StringConvert(decimal.Floor(s.SEMESTER)).Contains(searchString) 

希望这可以帮助 !!!

我现在面临同样的问题,我的目标是完全相同的原则。 经过长时间的搜索,我终于来到了这个:

 [HttpPost] public ActionResult Index(string searchString){ searchString = searchString.Replace(",", "."); if (!String.IsNullOrEmpty(searchString)){ students = students.Where(s => s.FIRST_NAME.Contains(searchString) || s.LAST_NAME.Contains(searchString) || s.PERSONAL_NUMBER.Contains(searchString) || s.ACD_UNI_DEGREES.DEGREE.Contains(searchString) || s.ACD_UNI_FACULTIES.FACULTY.Contains(searchString) || s.ACD_UNI_SPECIALIZATIONS.SPECIALIZATION.Contains(searchString) || (s.SEMESTER.ToString()).Contains(searchString) || s.COR_PAYER_STATUS.NAME.Contains(searchString) || SqlFunctions.StringConvert(s.CREDIT_COUNT).Contains(searchString)); } return View(students.ToList()); } 

您正在使用ToString()decimal为正常string 。 然而,这里的支撑是法术武器: (s.SEMESTER.ToString())这有所不同。

此语法将允许您使用表示法进行搜索. (例如:1203.4而不是1203,4)。 这不是真正的用户友好。

要解决此问题,请在searchString上使用.Replace(',', '.') 。 这将适用于背景技巧,没有人会注意到。

我希望它可以帮助任何人解决同样的问题。