如何使用 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 个或更多表
如何通过 LINQ to Sql 结果上的数据对分组进行 lambda?