これを行うには、いくつかのモデル定義関数を作成します。このリンクを参照してください:少なくとも Entity Framework 4 でのモデル定義関数の作成と呼び出し
具体的には、文字列を 10 進数に、文字列を int に変換する関数を追加するには、次の手順に従います。
テキストを編集できるように、.EDMX ファイルを XML として開きます。
カスタム変換関数を「CSDL コンテンツ」セクションの「スキーム」セクションに追加します。
<edmx:ConceptualModels>
<Schema....>
新機能:
<Function Name="ConvertToInt32" ReturnType="Edm.Int32">
<Parameter Name="myStr" Type="Edm.String" />
<DefiningExpression>
CAST(myStr AS Edm.Int32)
</DefiningExpression>
</Function>
<Function Name="ConvertToDecimal" ReturnType="Edm.Decimal">
<Parameter Name="myStr" Type="Edm.String" />
<DefiningExpression>
CAST(myStr AS Edm.Decimal(12, 2))
</DefiningExpression>
</Function>
(必要に応じて、上記の Edm.Decimal の精度を変更します。)
次に、C# コードで、静的クラスに格納できる対応する静的メソッドを作成する必要があります。
// NOTE: Change the "EFTestDBModel" namespace to the name of your model
[System.Data.Objects.DataClasses.EdmFunction("EFTestDBModel", "ConvertToInt32")]
public static int ConvertToInt32(string myStr)
{
throw new NotSupportedException("Direct calls are not supported.");
}
// NOTE: Change the "EFTestDBModel" namespace to the name of your model
[System.Data.Objects.DataClasses.EdmFunction("EFTestDBModel", "ConvertToDecimal")]
public static decimal ConvertToDecimal(string myStr)
{
throw new NotSupportedException("Direct calls are not supported.");
}
最後に、新しいメソッドを呼び出すには:
using (var ctx = new EFTestDBEntities())
{
var results = from x in ctx.MyTables
let TheTotal = ctx.MyTables.Sum(y => ConvertToDecimal(y.Price))
select new
{
ID = x.ID,
// the following three values are stored as strings in DB
Price = ConvertToDecimal(x.Price),
Quantity = ConvertToInt32(x.Quantity),
Amount = x.Amount,
TheTotal
};
}
具体的な例は次のようになります。
from p in db.TPs
join n in db.TNs
on p.Key equals n.Key
where (ConvertToDecimal(p.Value) ==
db.TNs.Where( nn => nn.Key == p.Key ).Sum( nn=> ConvertToDecimal(kk.Value)))