在执行数据库搜索时,如何通过字符串的值减去它的第一个字符(在我的情况下,第一个字符始终是 C 后跟数字)对列表进行排序。
我已经尝试了很多东西,但我几乎在黑暗中磕磕绊绊,我相信这里有人可以立即解决这个问题。
我的代码有效(但没有做我想要的):
List<Customer> customerlist = null;
try
{
customerlist = db.Customers
.Where(u => (u.Cust_ID+u.Given_Name+u.Surname).Contains(searchstring))
.OrderBy(u => u.Cust_ID)
.ToList();
}
我目前的错误代码(在我看来它应该可以工作,但导致搜索总是不返回任何结果):
List<Customer> customerlist = null;
try
{
customerlist = db.Customers
.Where(u => (u.Cust_ID+u.Given_Name+u.Surname).Contains(searchstring))
.OrderBy(u => Int32.Parse(u.Cust_ID.TrimStart('C')))
.ToList();
}
更多细节:
我的表中有一个名为 Cust_ID 的列,它以 C 开头,然后是一个不带前导零的数字,例如 C1、C2、... C43、... C999。
我允许用户执行搜索,其查询分配给 searchstring。
我已经尝试通过删除 int 解析进行调试
.OrderBy(u => u.Cust_ID.TrimStart('C'))
也不返回任何结果。
我在这里的原始代码仍然可以完成搜索,但不能正确排序。
.OrderBy(u => u.Cust_ID)
我尝试使用 Replace 而不是 TrimStart
.OrderBy(u => u.Cust_ID.Remove(0, 1))
这会返回一个结果,但仍然没有排序,当我放入 Int 解析时,它会停止再次返回结果:
.OrderBy(u => Int32.Parse(u.Cust_ID.Remove(0, 1)))
我尝试将 int 解析切换为:
.OrderBy(u => int.Parse(u.Cust_ID.Remove(0, 1)))
但这没有帮助。
编辑:发现我遇到了一个异常:
System.NotSupportedException: LINQ to Entities does not recognize the method 'Int32 ToInt32(System.String)' method, and this method cannot be translated into a store expression.
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.DefaultTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)
at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
at System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input)
at System.Data.Objects.ELinq.ExpressionConverter.TranslateLambda(LambdaExpression lambda, DbExpression input, DbExpressionBinding& binding)
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression& source, DbExpressionBinding& sourceBinding, DbExpression& lambda)
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod)
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)
at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
at System.Data.Objects.ELinq.ExpressionConverter.Convert()
at System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption)
at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at lab2.Controllers.DemoController.retrievecustomers() in [[Directory]]Controller.cs:line 52