我正在使用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之前提供理由,以便我改进我的问题......
答案 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);
这个应该比预先添加数字要快,因为你不需要每行进行多次计算,而是可以按现有数据排序。