0

LINQ to Entities を初めて使用しています。

私のデータ ストアには、他の特定のフィールドによっては整数になることが多い文字列フィールドがあります。このデータベースの構造を変更できません。

EF で問題となっているテーブルは部品です。

varname フィールドに基づくグループ化に基づいて、varvalue フィールドでこれらのレコードの合計を作成しようとしています。

var varsum = from md in context.masterdatas
             where md.imparcid == SelectedDataSet.imparcid && md.varname == t.VarName
             group md by md.varname into g
             select new { varname = g.Key, SummedAmt = g.Sum(md => Convert.ToDouble(md.varvalue)) };

LINQ to Entities がメソッド Double ToDouble(system string) を認識しないというエラーが表示されます。

このSO の質問に基づいて、DefiningExpression を EDMX モデルに追加し、データモデルの部分クラスで関数を定義して、次のコードを使用しました。

var varsum = from md in context.masterdatas
             where md.imparcid == SelectedDataSet.imparcid && md.varname == t.VarName
             group md by md.varname into g
             select new { varname = g.Key, SummedAmt = g.Sum(md => context.ParseDouble(md.varvalue)) };

ParseDouble 関数を LINQ to entity store 式に変換できないというエラーが表示されます。

私が実際にやろうとしているのは、この SQL ステートメントを実行することだけです。

SELECT [varname]
      ,[vartype]
      ,Sum(CASE WHEN Isnumeric([varvalue])=1 THEN cast([varvalue] as float) Else 0 END)
  FROM [masterdata]
  Group by varname, imparcid, vartype
  Having imparcid=25 AND varname = 'S2CMT8B'

これを行うための最良の方法について途方に暮れています。

4

1 に答える 1

2

LINQ クエリの最後の行で、インスタンスではなく、コンテキストクラスの静的 メソッドを呼び出す必要があります。ParseDoublecontext

// ...
select new { varname = g.Key, SummedAmt = g.Sum(md =>
    MyContextClass.ParseDouble(md.varvalue)) };
//  ^^^^^^^^^^^^^^
//  NOT the context instance, just the class name because ParseDouble is static

その場合にのみ、属性が EF によって処理されると信じていEdmFunctionます。それ以外の場合は、例外をスローする通常の .NET メソッドのようにメソッドを呼び出そうとします。

編集

EdmFunction属性で正しいモデルの名前空間を指定することも重要です。あなたのEDMXがこのように見える場合...

<edmx:ConceptualModels>
  <Schema Namespace="MyDBModel" Alias="Self"
      xmlns:annotation="http://schemas.microsoft.com/ado/2009/02/edm/annotation"
      xmlns="http://schemas.microsoft.com/ado/2008/09/edm">

    <!-- etc. -->

    <Function Name="ParseDouble" ReturnType="Edm.Double">
      <Parameter Name="stringvalue" Type="Edm.String" />
      <DefiningExpression>
        cast(stringvalue as Edm.Double)
      </DefiningExpression>
    </Function>

  </Schema>
</edmx:ConceptualModels>

MyDBModel... の最初のパラメーターとして、スキーマの名前空間を指定する必要がありますEdmFunctionAttribute

[EdmFunction("MyDBModel", "ParseDouble")]
public static double ParseDouble(string stringvalue)
{
    // ...
}

それ以外の場合ParseDouble、通常の .NET メソッドとして扱われ、store 式に変換できないという例外が発生します。

于 2012-09-10T16:12:39.037 に答える