在执行数据库搜索时,如何按字符串值减去第一个字符(在我的例子中,第一个字符始终是 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。
我允许用户执行搜索,其查询被分配给搜索字符串。
我尝试通过删除 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
最佳答案
您可以使用 AsEnumerable
在 OrderBy
之前切换到 LINQ to Objects。换句话说,您将在客户端执行 OrderBy
,而不是让 ORM 尝试(可以说是不成功)将其映射到 SQL 的 ORDER BY。
话虽这么说,在数据库中存储一个永远不会改变的前缀是一个坏主意。它浪费空间,迫使您使用错误的数据类型(VARCHAR 而不是 INT),在 ORDER BY 中触发错误类型的比较,并阻止 ORDER BY 使用索引(尽管您的 WHERE 似乎已经非常有效地做到这一点)。 .
关于c# - 在执行数据库搜索时使用 OrderBy 查询对不带第一个字符的数字进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12101895/