如何使用 linq lambda 对包含数值的 varchar 列进行排序到实体

Posted

技术标签:

【中文标题】如何使用 linq lambda 对包含数值的 varchar 列进行排序到实体【英文标题】:how to sort varchar column containing numeric values with linq lambdas to Entity 【发布时间】:2016-06-01 01:51:25 【问题描述】:

我正在使用 linq lambdas 在 MVC 中使用实体框架查询 mysql(注意 MySql 不是 Sql)。现在我有一张表product 其中一个列是price,数据类型为“VARCHAR”(接受我不能将类型更改为INT,因为它可以保存“N/A”等值)。

我想用 linq Lambdas 对 price 列进行数字排序。我已经尝试过下面的操作。我正在使用 Model 值来过滤查询。

var query = ent.Product.Where(b => b.cp == Model.CodePostal);

if (Model.order_by_flg == 2)

    query = query.OrderByDescending(a => a.price.PadLeft(10, '0'));

但它不起作用并给我下面的错误。

LINQ to Entities 无法识别方法 'System.String PadLeft(Int32, Char)' 方法,这个方法不能翻译 到商店表达式中。

由于它无法通过实体框架转换为 Sql 语句。

我也试过了。

var query = ent.Product.Where(b => b.cp == Model.CodePostal);

if (Model.order_by_flg == 2)

    query = query.OrderByDescending(a => a.price.Length).ThenBy(a => a.price);

但我不能这样做,因为它适用于 List,但我不能先制作列表,然后再这样做,因为我正在使用 linq Skip()Take() 所以首先我必须对其进行排序。

那么如何在 Linq lambda 中对“VARCHAR”类型的价格列进行排序?

编辑

在表格中是:

59,59,400,185,34

我使用 OrderBy.ThenBy 它给出的结果

34,59,59,106,185,400

它看起来像升序排序但是当我使用 OrderByDescending.ThenBy 它给出了

106,185,400,34,59,59

所以我不能用这个。

注意:请在投反对票之前给出理由,以便我改进我的问题...

【问题讨论】:

然后你用 OrderByDescending().ThenBy() 尝试后一种方法会发生什么? 未按预期排序,即使我使用了 OrderByDecending,它也会对诸如“106,185,400,34...”之类的值进行排序 【参考方案1】:

您可以像这样使用规范函数DbFunctions.Right 在 LINQ to Entities 中模拟固定的PadLeft

而不是这个

a.price.PadLeft(10, '0')

使用这个

DbFunctions.Right("000000000" + a.price, 10)

我还没有使用 MySql 提供程序对其进行测试,但是DbFunctions 中定义的规范函数应该被任何提供程序支持。

【讨论】:

感谢它的工作!你能告诉我 DbFunctions.Right("000000000" + a.price, 10) 到底是做什么的吗? 当然。它在文本左侧附加 9 个零,然后通过取右 10 个字符截断结果。因此,例如“12”->“00000000012”=>“0000000012”。而“1234”=>“0000000001234”=>“0000001234”【参考方案2】:

它看起来像升序排序但是当我使用 OrderByDescending.ThenBy 它给出了

106,185,400,34,59,59

那是因为您按长度降序排序,然后按值升序。 您需要的只是按降序对 both 进行排序;

query = query.OrderByDescending(a => a.price.Length)
              .ThenByDescending(a => a.price);

应该比添加数字排序要快,因为您不需要对每行进行多次计算,而是可以按现有数据进行排序。

【讨论】:

是的,你是对的,我错过了 .ThenByDescending。它的工作我有 2 解决同样的问题!!!

以上是关于如何使用 linq lambda 对包含数值的 varchar 列进行排序到实体的主要内容,如果未能解决你的问题,请参考以下文章

(Linq/Lambda) 使用 2 个 DBContext 连接 2 个或更多表

如何使用lambda表达式和LINQ将数据插入数据库表?

如何通过 LINQ to Sql 结果上的数据对分组进行 lambda?

如何在 LINQ 和 Lambda 表达式 LINQ C# 上正确执行 SQL 查询

Linq lambda 实体,不包含定义

错误:对于带有 from 的 Linq,“表达式树 lambda 可能不包含空传播运算符”