9

2つのテーブルを結合する必要がありますが、最初のテーブルのレコードに関連付けられているすべてのレコードの「値」の合計が同じである2番目のテーブルのレコードのみを返します。

from p in db.TPs
join n in db.TNs
on p.Key equals n.Key
where (decimal.Parse(p.Value) == db.TNs.Where( nn => nn.Key == p.Key )
                                       .Sum( nn=> decimal.Parse(kk.Value)))

私はEntityFrameworkCode-Firstを使用しています。

もちろん、Linqは文句を言います

LINQ to Entitiesは、メソッド'System.Decimal Parse(System.String)'メソッドを認識しません

テーブルは巨大で、出力を減らす必要があるため、クライアント側でこの変換を行うことはできません。列タイプの変換もオプションではありません。

SQLクエリは次のとおりです。

select * from TP as p
join * from TN as n on n.Key = p.Key
where p.Value = (select sum(cast(n.Value as decimal(12,2))) from TN where Key = p.Key)
4

3 に答える 3

10

これを行うには、いくつかのモデル定義関数を作成します。このリンクを参照してください:少なくとも 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)))
于 2012-08-31T14:49:12.470 に答える
0

残念ながら、LINQ to SQL では、文字列から 10 進数への変換を使用して SQL 式を作成することはできません。

これを行うには、次を使用して独自のクエリを実行する必要があります。

ExecuteStoredQuery

于 2012-08-31T13:21:59.307 に答える
0

を に変換する代わりに、 を にstring変換できdecimalます。他のアプローチが機能しない場合、このアプローチは機能する可能性があります。decimalstring

于 2012-08-31T13:24:11.660 に答える