1

以下を機能させようとして問題が発生しています。どちらもコンパイルしますが、実行時に例外をスローします。

ソリューションAのスロー

NotSupportedException "LINQ to Entities はメソッド 'MyDB.MemberClass GetMemberClass(MyDB.Member, System.DateTime)' メソッドを認識しないため、このメソッドをストア式に変換できません。"

ソリューション B スロー

NotSupportedException "LINQ 式ノード タイプ 'Invoke' は、LINQ to Entities ではサポートされていません。"

これが私のコードです:

    public delegate string GetClassShortName(Member m, DateTime d);

    private void UserControl_Initialized(object sender, EventArgs e)
    {
        //Solution A
        var members = from m in dbContext.Members
                      where new[] { "A", "P", "S", "J" }.Contains(MemberHelper.GetMemberClass(m, DateTime.Now).ShortName)
                      orderby m.Line
                      select m;

        //Solution B
        GetClassShortName gcsn = (n,d) => (MemberHelper.GetMemberClass(n, d).ShortName);
        var members = dbContext.Members.Where(m => new[] { "A", "P", "S", "J" }.Contains(gcsn(m, DateTime.Now)));

        foreach (Member m in members)
        {
            ...

値のセット内にある「クラス」を持つメンバーを取得しようとしています。(A、P、S、J)。メンバーのクラスは、時間の経過とともに変化するため、希望する日付に依存します。そのため、クラスは別のテーブルに格納され、MemberHelper.GetMemberClass 関数を使用して、指定された日付のクラスを取得します。(この場合は今)


新しいソリューション

すべての作業を LINQ で行うことをあきらめ、コードを次のように変更しました。これを行うにはもっとエレガントな方法があるかもしれませんが、うまくいきます。

        var data = from mj in this.dbContext.MemberJournals
                      where mj.Effective <= date
                      orderby mj.Member.Line, mj.Effective
                      select mj;

        foreach (MemberJournal mj in data)
        {
            if (mj.ClassID == MemberHelper.GetMemberClass(mj.Member, date).ID)
            {
                if (new[] { "A", "P", "J", "S" }.Contains(mj.MemberClass.ShortName.Trim()))
                {
                    //Perform my Task
                    ...
                }
            }
        }
4

1 に答える 1

3

SQL に変換されることを意図したコード内で、任意の C# メソッドを呼び出すことはできません。SQL に変換できるコードは、有効な C# の非常に限られたサブセットです。

于 2012-04-27T23:27:24.083 に答える