1

我有一个包含一列的数据库: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();

编译器告诉我不能隐式地将类型 ..< string > 转换为 ..< 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();

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

预先感谢您的帮助!

4

3 回答 3

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()方法对其进行排序并获取一个新列表,例如:

years = years.OrderBy(y => y).ToList();

// or order descending
years = years.OrderByDescending(y => y).ToList();
于 2013-07-31T15:05:38.673 回答
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,它更加灵活。此时,您可以转换对象、创建新对象等。

于 2013-07-31T15:11:04.793 回答
0

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

List<string>years = db.tbl1.Select(w => w.Year).Distinct().OrderBy(x=>x).ToList();

添加 order by 将确保内容在从数据库中出来时进行排序,这是您在其他情况下不会做的事情。

您可以更整洁地使用OrderByDescending然后省略Reverse您稍后执行的操作。

假设您所有的年份都是四位数,那么您将能够对它们进行字符串排序。只有当您的数字位数不同时,您才会遇到字符串排序数字的问题(例如 1、10、2、3)。原因是,如果您的数字都是相同的位数,那么比较的每个字符都将具有相同的数量级(例如,将始终将数千与数千进行比较)。

于 2013-07-31T15:15:34.590 回答