読者です 読者をやめる 読者になる 読者になる

1.21 jigowatts

Great Scott!

LINQ to Entitiesのクエリで数値型を文字列に変換する

C#

概要

LINQ to Entitiesのクエリで数値を文字列に変換したい場合、ToStringメソッドは使えません。
代わりに使用するのがSystem.Data.Objects.SqlClientのSqlFunctions.StringConvertメソッドになります。

検証

StringConvert(Nullable<Double>)メソッドで数値型を文字列に変換します。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Objects.SqlClient;

namespace EntityFramework.DAO
{
    public class Product
    {
        internal void StringConvert() {            
            using (EDMContainer Container = new EDMContainer()) {

                var rs = from p in Container.ProductGroups
                         select new
                         {
                             ID = p.ID, //p.IDはint型
                             //toStrID = p.ID.ToString(), ToStringメソッドを使うとNotSupportedExceptionがスローされます
                             sID = SqlFunctions.StringConvert((double)p.ID)
                         };

                foreach (var r in rs) {
                    System.Diagnostics.Debug.WriteLine("ID = [" + r.ID + "] , sID = [" + r.sID + "]");
                }            
            }        
        }
    }
}

これを実行すると出力結果は以下のようになります。

ID = [1] , sID = [         1]
ID = [2] , sID = [         2]
ID = [3] , sID = [         3]

文字列に変換するとスペースがあることがわかります。
これはStringConvertメソッドがSTR (Transact-SQL)に変換され実行されるためスペースが入るようです。
参考 http://msdn.microsoft.com/ja-jp/library/dd487127(v=vs.110).aspx

そして、このSTR関数は引数にlengthの指定が可能で規定値が10となっているため、スペースが入ってしまいます。

結合条件などにこのメソッドを使うと条件として成立せず値が取れないということもあるので注意が必要ですね。

まとめ

もし、LINQ to Entitiesのクエリで数値型を文字列に変換する場合は、
①StringConvert(Nullable<Decimal>, Nullable<Int32>)メソッドを使用してあらかじめ桁数を指定

sID = SqlFunctions.StringConvert((double)p.ID, 1)

②Trimメソッドを使用してスペースを取り除く

sID = SqlFunctions.StringConvert((double)p.ID).Trim()

少し手間をかけてあげる必要がありますね。