質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

キャスト

キャストとは、オブジェクトの型の変換が許可された場合に、明白に別の型への変換を行うプロセスのことです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

Q&A

解決済

2回答

26505閲覧

LINQでの文字列の並び替え(文字列→数値のキャスト)

DinKa

総合スコア40

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

キャスト

キャストとは、オブジェクトの型の変換が許可された場合に、明白に別の型への変換を行うプロセスのことです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

0グッド

0クリップ

投稿2016/06/22 06:09

編集2016/06/22 06:24

###前提・実現したいこと
LINQ中のorderbyで、文字列が1,10,11,・・・,2,20,・・・と並び替えられてしまうため、数値にキャストしたい。
LINQ中でSQLに数値型に変換できるキャスト方法。

###発生している問題・エラーメッセージ

型 'System.NotSupportedException' の例外が EntityFramework.SqlServer.dll で発生しましたが、ユーザー コード内ではハンドルされませんでした 追加情報:メソッド 'Int16 ToInt16(System.String)' は LINQ to Entities では認識されないため、ストア式に変換できません。

###該当のソースコード

C#

1orderby Convert.ToInt16(A.AAA)

###試したこと
使えそうなキャストは一通り試しました
上記のエラー:Convaert.ToInt16(A.AAA)、int.Parse(A.AAA)、Dictionary(A.AAA)
それ以前にエラー:checked((int)A.AAA)

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

LINQで変換できる文字列型には、SqlFunctions.StringConvertがあるのですが、SqlFunctionsの中にはIntConvertはありませんでした。
Dicitonaryは、string同士("1"→"01")もstringをstringに変換できないといわれました。
上記のように、OrderByで数値のように並び替えできるのであれば、キャストはできなくてもokです。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

データベースコンテキストから新しい別物のlistとして生成すればいけます。
この場合データベースの値を変更する際は該当のlistの要素のユニーク値を使って検索して変更も
できるかと思います。

var query_context = from q in context select new { data1 = q.data1, data2 = q.data2, intNo = ParseInt(q.strNo)//PaseIntはint.TryParseを使って自作 }; var list = query_context.ToList();  //修正分 var query_list = from q in list orderby q.intNo select q; var list_orderby = query_list.ToList();  foreach(var i in list_orderby) { Console.WriteLine(i.data1); Console.WriteLine(i.data2); Console.WriteLine(i.intNo); }

投稿2016/06/22 07:09

編集2016/06/23 07:06
makiikeda1216

総合スコア128

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DinKa

2016/06/22 10:28

makiikeda1216さん、ご回答ありがとうございます。 別物のListということですが、strNoをLINQ中にIntでキャストするということでしょうか? ソースの、 >PaseIntはint.TryParseを使って自作 が理解できていないので調べてみます。
makiikeda1216

2016/06/23 04:47 編集

>>別物のListということですが、strNoをLINQ中にIntでキャストするということでしょうか? int.TryParseでLINQ中にIntにキャストしています。 今回みたいな文字列から数値の変換を行う場合、int.TryParseを使ってキャストするのが安全だと思います。 自作というのはint.TryPaseが返すのはキャストした数値ではないので、自分でint.TryParseをラッピングした関数をつくって数値を返してあげる関数を作る必要があるからなのです。あとはキャスト時に問題があっても自作しておけば柔軟に対応できます。 例えば private static int ParseInt(string str) { int result; int.TryParse(str, out result); return result; } こんな感じで作ればある程度のstrNoなら対応できるかと思います。 int.TryParseは数値の変換に失敗した場合falseを返し、resultに0が入るので、失敗した場合0以外の数値を返したい場合は上の例を改良してください。
DinKa

2016/06/23 06:33

追記ありがとうございます。 実際に、orderbyの箇所に適応してみました。 orderby ParseInt(A.AAA) ParseIntは、例を参考にさせていただいて作成しました。 ただ、やはりLINQでは使用できないようで、以下のエラーが発生しています。 型 'System.NotSupportedException' の例外が EntityFramework.SqlServer.dll で発生しましたが、ユーザー コード内ではハンドルされませんでした 追加情報:メソッド 'Int32 ParseInt(System.String)' は LINQ to Entities では認識されないため、ストア式に変換できません。
makiikeda1216

2016/06/23 07:08 編集

>>orderby ParseInt(A.AAA) このやり方はオリジナルのコンテキストではソートできません 新しいlistを生成してint型(intNo)でソートをする方法です。 回答のコードを少し修正して orderby を使ったコードを追加しましたので 修正コードのように使う提案です。
DinKa

2016/06/23 07:15

追記ありがとうございます。 なるほど、List型で作成して、LINQ to Objects を使う方法ですね。 適応してみたところエラーが出ずにソートできました。 丁寧な説明ありがとうございました。
guest

0

  • DBのカラム型をNumberにする
  • DBにFunctionを作成してそれを利用する
  • 一度ToList()した後、LINQtoObjectsでOrderBy()

などはいかがでしょう。

投稿2016/06/22 08:16

TAKA_0921

総合スコア234

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

DinKa

2016/06/22 10:22

TAKA_0921さん、回答ありがとうございます。 (1)DBのカラム型をNumberにする これは、DBの構成上難しいです。 (2)DBにFunctionを作成してそれを利用する SQLサーバー側ということだと思いますが、SQLServerの知識が必要そうですね。検討してみます。 (3)一度ToList()した後、LINQtoObjectsでOrderBy() これが一番現実的そうですね。ただ、LINQtoObjectsに関して理解していないので、調べてみます。 ありがとうございました。
DinKa

2016/06/23 08:37

今回は(3)を適応させていただきます。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問