0
public static object ExecuteScalar(string SQL)
{
    try
    {
        var A = new EGModel.EGEntity().Connection;

        var command = ((EntityConnection)(A)).StoreConnection.CreateCommand();
        command.CommandType = System.Data.CommandType.Text;
        command.CommandText = SQL;
        if (((EntityConnection)(A)).StoreConnection.State == System.Data.ConnectionState.Closed)
            ((EntityConnection)(A)).StoreConnection.Open();

        return command.ExecuteScalar();
    }
    catch { return null; }
}

public object MFICHE(int ID)
        {
            var i = from b in IConnection.EGEntity().fiche
                    where (m.ID== ID)
                    select new { b.Date, m.Name, Addresss = IConnection.ExecuteScalar("SELECT main.F_ADDRESS(4588)") };

            return i;
        }

エラーが発生しています:

LINQ to Entities はメソッド 'System.Object ExecuteScalar(System.String)' メソッドを認識せず、このメソッドはストア式に変換できません。エラーが発生するのはなぜですか?

しかし、Addresss = "ASASAS" は実行されていますか?

4

1 に答える 1

1

問題は、クエリから生成された式ツリーにExecuteScalarメソッドへの呼び出しが含まれていることです。Entity Framework 式パーサーはそれについて何も知りません。そのメソッドが何をしているのかを確認するためにそのメソッドの内部を調べることはありません。呼び出しが存在することを知っているだけで、それを変換できないために失敗します。

通常、クエリから返された結果ごとに個別の SQL ステートメントを実行したくないでしょうか? 明らかな「N + 1選択」の問題があります。

(ID の制約により) 結果が 1 つしかないことがわかっている場合は、関連するデータをオブジェクトにフェッチしてから、2 番目のクエリを実行できます。

public object MFICHE(int ID)
{
    var query = from b in IConnection.EGEntity().fiche
                where b.ID == ID
                select new { b.Date, b.Name };
    // You only expect a single result, right?
    var result = query.Single();
    // Shouldn't this be using something to do with the result?
    var address = IConnection.ExecuteScalar("SELECT main.F_ADDRESS(4588)");
    return new { result.Date, result.Name, Address = address };
}

余談ですが、 で始まる型I(通常はインターフェイス) に静的メソッドがあるのは非常に奇妙です。さらに、このコード:

catch { return null; }

恐ろしいです-特定の例外をキャッチしてログに記録し、通常は再スローする必要があります。何も問題がなかったかのように続行することは、ほとんど適切ではありません。

于 2012-07-14T08:10:35.657 に答える