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();

但我知道这不是一个优雅的解决方案。

提前感谢您的帮助!

Linq filter using List<int>

您只需要将第一行更改为:

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();