Linq filter using List<int>
本文关键字:int gt filter lt List Linq using | 更新日期: 2023-09-27 18:25:50
我有一个数据库,其中有一列:Year(nvarchar),我想将该列的值添加到一个下拉框中,按降序排序。
这是我正在使用的代码:
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();
编译器告诉我不能简单地转换类型<字符串>到<int>。。。
我是一个大人物,我不知道如何解决这个问题。你能帮帮我吗?
我对此喋喋不休,但与我相似的话题并没有帮助我弄清楚。
为了解决我的问题,我使用了一种非常不专业的方法:
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();
但我知道这不是一个优雅的解决方案。
提前感谢您的帮助!
您只需要将第一行更改为:
List<string>years = db.tbl1.Select(w => w.Year).Distinct().OrderBy(x=>x).ToList();
添加order by将确保在内容从数据库中出来时对其进行排序,这是您在其他方面没有做的。
可以更巧妙地使用OrderByDescending
,然后省略稍后所做的Reverse
。
假设你所有的年份都是四位数,那么你就可以对它们进行字符串排序。只有当你有不同的位数时,你才会遇到字符串排序数字的问题(例如1、10、2、3)。原因是,如果你的数字都是相同的位数,那么被比较的每个字符都将具有相同的数量级(例如,数千总是被比较为数千)。
当对数据库使用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,它更加灵活。此时,您可以转换对象、创建新对象等。
您可以尝试使用Select()
方法并在int
中转换Year(字符串)。类似这样的东西:
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();