我有一个包含列的数据库:Year(nvarchar),我想将此列的值添加到dropbox中,按降序排序。
这是我正在使用的代码:
List<string>years = db.tbl1.Select(w => w.Year).Distinct().ToList();
years.reverse();
foreach (string year in years) { drop_years.Items.Add(year);}
它没有用,因为我会有类似的东西:2012年,2010年,2009年,2011年等。
如果我使用:
List<int> years = db.tbl1.Select(w => w.Year).Distinct().ToList();
编译器告诉我,不能隐式转换类型..&lt;字符串&gt;到...&lt; int&gt; ...
我是一个很重要的人,我不知道如何解决这个问题。 你能帮我吗?
我对此有所了解,但与我的类似主题并没有帮助我弄明白。
为了解决我的问题,我使用了一种非常不专业的方法:
var years = db.tbl1.Select(w => w.Year).Distinct();
List<int> yearsList = new List<int>();
foreach (string year in years)
{ yearsList.Add(Convert.ToInt32(year)); }
yearsList.Sort(); //I used Sort() because doesn't work only with Reverse();
yearsList.Reverse();
但我知道这不是一个优雅的解决方案。
提前感谢您的帮助!
答案 0 :(得分:0)
您可以尝试使用Select()
方法并在int
中转换年份(字符串)。像这样:
var years = db.tbl1.Select(w => w.Year).Distinct().ToList().Select(x => int.Parse(x));
它将对数据库执行查询,获取dinstinc和year列,在它之后,它将在内存(linq到对象)中转换为IList<int>
。在此之后,years
将是IList<int>
,您可以使用Sort()
和此类型(或扩展程序)的其他方法:
years = years.Sort();
您也可以使用OrderBy()
方法对其进行排序并获取新的List,以供样本使用:
years = years.OrderBy(y => y).ToList();
// or order descending
years = years.OrderByDescending(y => y).ToList();
答案 1 :(得分:0)
对数据库使用LINQ时,您可以做的事情非常有限。但如果您转换为实体,您可以获得更多的权力!
var years = db.tbl1
.Select(y => y.Years)
.Distinct()
.ToList() // Forces the SQL query to execute and return your string list
.Select(y => int.Parse(y.Years))
.OrderByDescending(y => y);
这应该执行你的SQL,将字符串解析为整数(似乎你想从你的代码示例中得到这个,如果没有,ToList和第二个Select是不必要的)并返回一个整数类型的降序列表。
基本上,针对SQL的查询通常无法执行更强大的检查,转换等。此外,Select
语句实际上用作投影来优化SQL查询以在所需字段上进行选择。如果需要将结果集转换为业务对象,则必须首先调用ToList()(或ToArray())以使查询执行并返回结果。之后的一切都是LinqToEntities,它更加灵活。此时,您可以转换对象,创建新对象等。
答案 2 :(得分:0)
您需要的只是第一行改为:
List<string>years = db.tbl1.Select(w => w.Year).Distinct().OrderBy(x=>x).ToList();
添加订单将确保内容在数据库出现时进行排序,这是您不会做的事情。
您可以更加整洁地使用OrderByDescending
,然后省略稍后执行的Reverse
。
假设您的所有年份都是四位数,那么您将能够对它们进行字符串排序。只有当你有不同的数字位数时才会遇到字符串排序数字的问题(例如1,10,2,3)。原因是如果你的数字都是相同的数字,那么每个比较的字符将具有相同的数量级(例如,数千个将始终与数千个进行比较)。