如何使用linq lambdas将包含数值的varchar列排序到实体

时间:2016-02-19 13:11:00

标签: mysql asp.net-mvc entity-framework linq lambda

我正在使用linq lambdas在MVC中使用Entity Framwork查询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)'方法,这个方法无法翻译   进入商店表达。

因为它无法通过Entity Framwork转换为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()所以首先我必须对它进行排序。 / p>

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

修改

在表中它是:

59,59,400,185,34

我使用OrderBy.ThenBy它给出了

34,59,59,106,185,400

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

106,185,400,34,59,59

所以我不能用它。

注意:请在Downvote之前提供理由,以便我改进我的问题......

2 个答案:

答案 0 :(得分:2)

您可以使用规范函数DbFunctions.Right模拟LINQ to Entities中的固定echo "<label>".$row["name"]."</label> <input ".($row["completed"]) ? 'checked' : ''." class='sssss' value='".$row['id']."' type='checkbox'/>";

而不是

PadLeft

使用此

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

我没有使用MySql提供程序对其进行测试,但DbFunctions.Right("000000000" + a.price, 10) 中定义的规范函数应该由任何提供程序支持。

答案 1 :(得分:2)

  

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

     

106,185,400,34,59,59

那是因为你按长度降序排序,然后值升序 你需要的只是通过降序两个来排序;

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

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