我正在为我的公司编写应用程序,目前正致力于搜索功能。当用户搜索项目时,我想显示最高版本(存储在数据库中)。
问题是,版本存储为字符串而不是int,当我对结果执行OrderBy(q => q.Version)时,它们会像
一样返回1
10
11
2
3
...
显然2在10之前。
我有没有办法将版本转换为整数或是否有一个简单的IComparer?到目前为止,我找不到任何实质内容。
我试过这样做:
var items = (from r in results
select r).OrderBy(q => Int32.Parse(q.Version));
这会编译但不起作用。
答案 0 :(得分:25)
LinqToSql转换器不支持Int32.Parse。支持Convert.ToInt32。
答案 1 :(得分:7)
您的问题出在其他地方,以下是有效的:
new[] { "1", "10", "2", "3", "11" }
.OrderBy(i => int.Parse(i))
.ToList()
.ForEach(Console.WriteLine);
如果您的问题是LINQ to SQL,那么正在发生的事情是CLR正在尝试从您的LINQ创建SQL并且不理解int.Parse
。您可以做的是首先从SQL获取数据,然后在加载所有数据后对其进行排序:
var items = (from r in results
select r)
.ToList()
.OrderBy(q => Int32.Parse(q.Version));
应该这样做。
答案 2 :(得分:6)
如果您无法更改表格定义(因此版本是数字类型),并且您的查询确实如下所示(您不使用跳过,或采取或以其他方式减少结果数量),最好你可以做的是在未排序的结果上调用“ToList”,然后当你将一个OrderBY lambda应用到它时,它将发生在你的代码中,而不是试图在SQL Server端进行(现在应该可以工作)。 / p>
答案 3 :(得分:5)
你为什么要在lambda中排序?你为什么不在查询中排序?
var query = from r in items
orderby int.Parse( r )
select r;
现在我们知道您正在使用LINQ to SQL,您可以考虑通过执行以下操作来对此进行标准SQL调用:
Select ..., Cast( TextWhichShouldBeIntCol As int ) As IntCol
From ...
甚至
Select ..., Cast( TextWhichShouldBeIntCol As int ) As IntCol
From ...
Order By Cast( TextWhichShouldBeIntCol As int )
这将作为一个int流入你的LINQ(如果你使用第二次迭代,则需要订购)。这避免了必须在LINQ中两次遍历结果集(一次用于查询,一次用于排序)。
答案 4 :(得分:5)
有一个很棒的代码,在自然分类方面做得很好。它的名字是AlphanumComparator
。
示例代码:
var ordered = Database.Cars.ToList().OrderBy(c => c.ModelString, new AlphanumComparator());
请注意,列表必须在内存中。
如果您获得C#版本,请执行以下操作:
AlphanumComparator : IComparer<string>
和
public int Compare(string x, string y)
答案 5 :(得分:1)
我做了一个测试。我有以下代码。
string[] versions = { "1", "2", "10", "12", "22", "30" };
foreach (var ver in versions.OrderBy(v => v))
{
Console.WriteLine(ver);
}
正如所料,结果是1分,10分,12分,2分,22分,30分
然后,我们将versions.OrderBy(v => v))
更改为versions.OrderBy(v => int.Parse(v)))
。它工作正常:1,2,10,12,22,30
我认为你的问题是你的字符串中有非数字字符,如'。'。你得到什么样的例外?
答案 6 :(得分:1)
试试这个:
var items = results.(Select(v => v).OrderBy(v => v.PadLeft(4));
这将在Linq2Sql中起作用
答案 7 :(得分:1)
如果您只需要“最高版本”,为什么要排序?如果您使用Max(),听起来可以避免一些开销。
另外,您确实应该将列类型更改为整数。
答案 8 :(得分:1)
var items = (from r in results
select r).OrderBy(q => Convert.ToInt32(q.Version));
绝对跑......
答案 9 :(得分:0)
听起来你有一个文本值而不是数值。
如果您需要排序,可以尝试:
var items = (from r in results
select r);
return items.OrderBy( v=> Int.Parse(v.Version) );
答案 10 :(得分:0)
var query = from r in items
let n = int.Parse(r)
orderby n
select n;
答案 11 :(得分:0)
var items = (from v in results
select v).ToList().OrderBy(x => int.Parse(x.Version));