2013-02-28 8 views
5

私はMVC4とEntity Framework 5のアプリケーションで作業していますが、最近私のクエリを実行するときにこの例外が発生しました。EF5.xのPadLeftのサポートが不足しているための回避策はありますか?

は{ "方法 '可能System.String PadLeft(のInt32、シャア)' 方法、及びこの方法を認識しないエンティティにLINQは、格納式に変換することができない。"}

いつ過去に同様のエラーが発生した場合は、クエリの外部に変数を作成してから、変数をLINQステートメントで使用しました。残念ながら、この場合、私は行の結果を操作しているので、その方法についてはわからない、またはそれが最善の方法であるかどうかはわかりません。どんな助けもありがとう。私のクエリは以下の通りです:

  IQueryable<System.String> LEAPrograms = db.Datamart_Draft 
      .Where(where => where.snapshot_id == snapshot_id 
       && !String.IsNullOrEmpty(where.entity_program)) 
      .Select(sel => (sel.entity_program.PadLeft(PROGRAMLENGTH, '0'))).Distinct(); 
+1

'entity_program'を適切な数の0で埋めるテーブルで追加の計算カラムを作ることができますか? – cfeduke

+0

それは可能ですが、私は再利用可能なものを好むでしょう。私はそれを避けることができるならば、私はパッドする必要がある各列のための追加の列を作成したくないです。 – Elsimer

答えて

-4

私は結果を反復処理し、リストを作成することになりました。リスト上で.Distinct()を実行すると、IEnumerableにキャストされます。私はパフォーマンス上の賢明さはわかりませんが、PadLeftはLINQ for Entitiesとほぼ同じように作成できると思っています。

  IEnumerable<String> LEAPrograms = db.Datamart_Draft.Where(wh => wh.snapshot_id == snapshot_id && !String.IsNullOrEmpty(wh.entity_program)).Select(se => se.entity_program).Distinct(); 
     // create and populate a List (because LINQ to Entities doesn't support PadLeft) 
     List<String> PaddedPrograms = new List<String>(); 
     foreach (var row in LEAPrograms) 
     { 
      PaddedPrograms.Add(row.PadLeft(4, '0')); 
     } 
     LEAPrograms = PaddedPrograms.Distinct(); 
12

それはあまりにもエレガントではないのですが、それは仕事をしていません:

... 
.Select(sel => SqlFunctions.Replicate 
        ("0", PROGRAMLENGTH - sel.entity_program.Length) 
      + sel.entity_program) 
+0

ありがとう! – David

-2

私はエレガントなGert Arnoldのソリューションだと思います。

List<string> samplesWithoutMeasures = new List<string>(); 
samplesWithoutMeasures = (from mm in DB.MEDICIONESMUESTRA 
    join mu in DB.MUESTRAS on mm.IDMUESTRA equals mu.IDMUESTRA 
    where (mu.IDESTADOMUESTRA >= 7 && mu.IDESTADOMUESTRA <= 8) && (mu.ESDUPLICADODE == null) && 
      (mm.IDESTADOMEDICIONMUESTRA == 1 && mm.IDPARAMETRO == Parameter.IDPARAMETRO) && 
      (mu.FECHARADICACION >= StartDate && mu.FECHARADICACION <= EndDate) 
    select SqlFunctions.Replicate("0", 15 - (SqlFunctions.StringConvert((double)mm.IDMUESTRA).Trim()).Length) 
      + SqlFunctions.StringConvert((double)mm.IDMUESTRA).Trim() 
    ).ToList(); 
+1

申し訳ありませんが、これはナンセンスです。あなたにとっては、それは意味がない、他のみんなにとって(OPを含む)「本当の」解決策かもしれません。 OPのデータとは何の関係もありません。 –

関連する問題