在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(',', '.')
。 这将适用于背景技巧,没有人会注意到。
我希望它可以帮助任何人解决同样的问题。