1

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

コンパイラは、型 ..< 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

必要なのは、最初の行を次のように変更することだけです。

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

order by を追加すると、コンテンツがデータベースから出力されたときに確実にソートされます。これは、他の方法では行わないことです。

よりきれいに使用して、後で行うことをOrderByDescending省略できReverseます。

すべての年が 4 桁であると仮定すると、文字列をうまく並べ替えることができます。文字列のソート番号で問題が発生するのは、桁数が異なる場合のみです (例: 1、10、2、3)。その理由は、数値がすべて同じ桁数である場合、比較される各文字は同じ桁数になるためです (たとえば、千は常に千と比較されます)。

于 2013-07-31T15:15:34.590 に答える
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と2番目のSelectは不要です)。整数型の年の降順リストを返します。

基本的に、SQL に対するクエリは通常、より強力なチェックや変換などを実行できません。さらに、Selectステートメントは実際には、SQL クエリを最適化して必要なフィールドを選択するための射影として使用されます。結果セットをビジネス オブジェクトに変換する必要がある場合は、最初に ToList() (または ToArray()) を呼び出して、実行するクエリを取得し、結果を返す必要があります。それ以降はすべて、はるかに柔軟な LinqToEntities です。その時点で、オブジェクトを変換したり、新しいオブジェクトを作成したりできます。

于 2013-07-31T15:11:04.793 に答える
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 に答える