Dar*_*rcy 37 c# linq asp.net-mvc sql-order-by linq-to-sql
我正在为我的公司编写一个应用程序,目前正致力于搜索功能.当用户搜索项目时,我想显示最高版本(存储在数据库中).
问题是,版本存储为字符串而不是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));
这编译但不起作用.
Amy*_*y B 26
LinqToSql转换器不支持Int32.Parse.支持Convert.ToInt32.
http://msdn.microsoft.com/en-us/library/sf1aw27b.aspx
http://msdn.microsoft.com/en-us/library/bb882655.aspx
您的问题在其他地方,以下工作:
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));
应该这样做.
如果您无法更改表定义(因此版本是数字类型),并且您的查询确实如下所示(您不使用跳过,或采取或以其他方式减少结果数),您可以做的最好在未排序的结果上调用"ToList",然后当你将一个OrderBY lambda应用到它时,它将发生在你的代码中,而不是试图在SQL Server端执行(现在应该可以工作).
你为什么要在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中执行两次结果集(一次用于查询,一次用于排序).
有一个很棒的代码,在自然分类方面做得很好.它的名字是AlphanumComparator.
示例代码:
var ordered = Database.Cars.ToList().OrderBy(c => c.ModelString, new AlphanumComparator());
请注意,列表必须在内存中.
如果您获得了C#版本,请执行以下操作:
AlphanumComparator : IComparer<string>
和
public int Compare(string x, string y)
| 归档时间: | 
 | 
| 查看次数: | 26568 次 | 
| 最近记录: |