15

次のLINQ式があります。nvarcharフィールド内の数値の合計を計算したい。これを行うために次のコードを使用していますが、これを実行しようとするとエラーが発生します。

var m = new MaterialModelContainer();

var list = 
    (from x in
        (
            from inv in m.INVs
            join l in m.LIBs on inv.MESC equals l.MESC
            join o in m.OUTs on inv.MESC equals o.MESC
            join t in m.TRANs on inv.MESC equals t.MESC
            where t.TYPE == "60"
            select new
            {
                l.MESC,
                l.LINE_NO,
                l.UNIT_LINE,
                Description = l.DES + " " + l.PART_NO,
                inv.NEW_QTY,
                o.PJ,
                o.DATE,
                o.QTY,
                o.QTY_REC,
                TranQty = t.QTY,
                tranDate = t.DATE
            }
        )
        group x by
            new
            {
                x.MESC,
                x.LINE_NO,
                x.UNIT_LINE,
                x.Description,
                x.NEW_QTY,
                x.PJ,
                x.DATE,
                x.QTY,
                x.QTY_REC
            }
        into g
        select new
        {
            QTY_Consum_1 = g.Where(c => int.Parse(c.tranDate) >= cuDate && int.Parse(c.tranDate) <= endDate).Sum(d => int.Parse(d.TranQty))
        }
    ).ToList();

エラーの説明:

LINQ to Entities はメソッド 'Int32 Parse(System.String)' メソッドを認識せず、このメソッドはストア式に変換できません

この問題を解決し、このコードをこれよりもうまく書くにはどうすればよいでしょうか?

コードを次のように変更しました。

select new
{
    QTY_Consum_1 = g.Where(c => SqlFunctions.StringConvert(c.tranDate) >= cuDate && SqlFunctions.StringConvert(c.tranDate) <= endDate).Sum(d => SqlFunctions.StringConvert(d.TranQty)),
   g.Key.MESC
}
).ToList();

しかし、このエラーが発生しました: ここに画像の説明を入力

4

7 に答える 7

17

EF5:

int.Pasrse使用する代わりにConvert.ToInt32。Entity Framework はCAST、SQL で適切な関数を生成します。

EF6:

簡潔な答え:

youEntity.Where(c=>SqlFunctions.StringConvert((decimal?)c.INTFIELD).Trim() == STRINGVALUE)

長い答え:

EF 6 では、 SqlFunctions.StringConvertを使用して数値を文字列に変換する必要があります。しかし、それには問題があります。結果に不要なスペースが追加されます。したがって、比較は失敗します。そういうわけで私はTrim()そこに置きました。EF 6.1.1 でテストしました。

于 2014-06-25T13:52:07.143 に答える
6

Entity Framework は、その種類の変換を SQL に変換できません。

実際の型などの適切なデータ型を使用するようにデータ構造を変更できる可能性はありますDateTimeか? 大量のデータの場合、そのような変換はパフォーマンスに影響します。

これらの変換を避けるためにデータ モデル タイプを変更するか、データ量が常に少ない場合は、最初にデータを取得し、後で Linq to Objects を使用することをお勧めします。

于 2012-08-25T01:10:40.773 に答える
5

where句では、を呼び出すことはできませんint.Parse。Entity Frameworkは、それをSQLに変換する方法を知りません。を改訂することを検討してくださいWhere

于 2012-08-25T00:44:08.680 に答える
4

では int.parse を使用できませんwhere。次のようにクエリを書き直すことができます。

var list = (from x in
                (
                    from inv in m.INVs
                    join l in m.LIBs on inv.MESC equals l.MESC
                    join o in m.OUTs on inv.MESC equals o.MESC
                    join t in m.TRANs on inv.MESC equals t.MESC
                    where t.TYPE == "60" && t.QTY!=""
                    select new
                       {
                           l.MESC,
                           l.LINE_NO,
                           l.UNIT_LINE,
                           Description = l.DES + " " + l.PART_NO,
                           inv.NEW_QTY,
                           o.PJ,
                           o.DATE,
                           o.QTY,
                           o.QTY_REC,
                           TranQty = t.QTY,
                           tranDate = t.DATE

                      }
                ).ToList()
            group x by
                new
                    {
                        x.MESC,
                        x.LINE_NO,
                        x.UNIT_LINE,
                        x.Description,
                        x.NEW_QTY,
                        x.PJ,
                        x.DATE,
                        x.QTY,
                        x.QTY_REC
                    }
            into g
            select new
                {
                    QTY_Consum_1 = g.Where(c => int.Parse(c.tranDate) >= cuDate && int.Parse(c.tranDate) <= endDate).Sum(d => int.Parse(d.TranQty)),
                    g.Key.MESC
                }
           ).ToList();

.ToList()メソッドを呼び出してから、 を使用しますint.Parse(variable)

良い1日を。

于 2012-08-25T01:58:47.813 に答える
4

int.Parseすべてをに置き換えますSqlFunctions.StringConvert(variable)。String を Int に変換する関数はありません。逆を行い、StringConvert を使用して Int を String に変換するようにしてください。

SqlFunctions ユーティリティは、SQL コマンドのコマンドを変換できます。

于 2012-08-25T00:59:10.997 に答える
-1

編集できないデータベースがあり、使用する必要があります。

私はこれをLinq-To-Sqlで使用していますが、うまくいきます。

最初に文字列をオブジェクトにキャストしてから、int にキャストします。

 from s in db.Students
 select new
 {
     s.Name,
     s.Surname,
     Birthday = new DateTime((int)(object)(s.dateStr.Substring(0, 4)),
                             (int)(object)(s.dateStr.Substring(4, 2)),
                             (int)(object)(s.dateStr.Substring(6, 2))),
 }
于 2014-03-11T16:37:45.647 に答える
-1

LINQ to Entities で CLR メソッドを使用できることを確認する必要がある場合は、次のソースを参照することをお勧めします: https://msdn.microsoft.com/en-us/library/vstudio/dd456828(v=vs.100) .aspx .

速読ではありませんが、時間がかかりますが、これがあなたの質問に対する答えです (そして、それに似た質問が他にもたくさんあります)。

于 2015-08-31T14:49:19.503 に答える