c# - 在执行数据库搜索时使用 OrderBy 查询对不带第一个字符的数字进行排序

标签 c# database arrays linq-to-sql sorting

在执行数据库搜索时,如何按字符串值减去第一个字符(在我的例子中,第一个字符始终是 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

最佳答案

您可以使用 AsEnumerableOrderBy 之前切换到 LINQ to Objects。换句话说,您将在客户端执行 OrderBy,而不是让 ORM 尝试(可以说是不成功)将其映射到 SQL 的 ORDER BY。

话虽这么说,在数据库中存储一个永远不会改变的前缀是一个坏主意。它浪费空间,迫使您使用错误的数据类型(VARCHAR 而不是 INT),在 ORDER BY 中触发错误类型的比较,并阻止 ORDER BY 使用索引(尽管您的 WHERE 似乎已经非常有效地做到这一点)。 .

关于c# - 在执行数据库搜索时使用 OrderBy 查询对不带第一个字符的数字进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12101895/

相关文章:

PHP 在空值上合并数组

javascript - MongoDB - 查找一组文档之间的共同值计数

c# - 为什么 Entity Framework 6 不支持 Discriminator 的显式过滤?

c# - NHibernate 中使用代码映射的多对多关系

mysql - 连接 MySQL 和 R

java - J2SE 和数据库访问

c - C语言中如何将两个字符串相加?

c# - 由于流程,应用程序保持打开状态

c# - 使用 OleDB 读取范围 Excel 工作表

php - 如何从 MySQL 查询中获取 PHP 变量?