以下を機能させようとして問題が発生しています。どちらもコンパイルしますが、実行時に例外をスローします。
ソリューション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
...
}
}
}