この質問は、動的ラムダ式でのCount()プロパティの取得の続きです。
動的ラムダ式にCount()メソッドを配置できるかどうかを尋ねていました。 Dynamic Expression APIを使用してそれを行うことができます 。提供される回答-xmojmr
しかし最近、フィルタリングされたデータを持つ子エンティティで結果を取得するには、動的ラムダ式を実装する必要がありました。
詳細:
子エンティティがリンクされた親エンティティがあります。親エンティティからデータを取得すると、子データを含むデータのコレクションも返されます。
以前の要件に従って、返されたすべての子レコードを、各親レコードに対してカウントする必要がありました。
私はそれを使ってそれをしました-
ParameterExpression cParam = Expression.Parameter(typeof(CPNDBase), "c");
NewExpression newExp = Expression.New(typeof(DTDataModel));
List bindings = new List();
MemberInfo memberInfo = typeof(DTDataModel).GetMember("FILE_COUNT")[0];
Dictionary paramExSymbols = new Dictionary();
paramExSymbols.Add("c", cParam);
Expression expression = System.Linq.Dynamic.DynamicExpression.Parse(null, "c.CPNDocs.Count()", paramExSymbols);
MemberBinding memberBinding = Expression.Bind(memberInfo, expression);
bindings.Add(memberBinding);
MemberInitExpression memberInitExpression = System.Linq.Expressions.Expression.MemberInit(newExp, bindings);
Expression> selector = (Expression>)BinaryExpression.Lambda(memberInitExpression, cParam);
var finalFilteredCPNData = filteredCPNData.AsQueryable().Select(selector);
ここでは、親の結果セットに対するc参照と、子エンティティの結果セットであるCPNDocs内のレコードをカウントしようとするc.CPNDocs.Count()を使用しています。
Dynamic Expression APIを使用してそれを実現できました。
今私の最近の必要性は私の以前の要件を変更することであり、私は動的表現を生成する必要があります
c.CPNDocs.Where(a => a.L_STAT == true).Count()
ここでカウントする前に、メンバー変数に基づいてデータをフィルタリングする必要があります。 動的式APIを試しましたが、ラムダ式でエラーが発生しました。ビルドできません。
誰かがこれを手伝ってくれる?
Dynamic Expression APIの仕組みを理解しました。私がこれらのテクノロジーに慣れていないと言ったように、私はまだ物事を学んでいます。
私は達成しなければなりc.CPNDocs.Where(d => d.L_STAT==true).Count()
文字列で式を記述する必要があると思いました。DynamicExpression APIはそれを実際の式に解析しますが、私は間違っていました。実際には、 Dynamic Expression APIの Parseメソッドに、実行したいことを伝える必要があります。
だから私はc.CPNDocs.Count()を
Expression expression = System.Linq.Dynamic.DynamicExpression.Parse(null, "c.CPNDocs.Count()", paramExSymbols);
c.CPNDocs.Where(L_STAT == true).Count()を使用します。 Where句に注意してください。LAMBDA式ではなく、条件のみです。 解析メソッドは、私が何をしようとしているのかをスマートに理解し、それを動的参照を持つ式に変換し、探していたものとまったく同じ式を生成します-
c.CPNDocs.Where(Param_0 => (Param_0.L_STAT == True)).Count()
ここで、 Param_0は、CPNDoc(CPNDocsのRecordインスタンス)に対して作成された動的参照です。だから最終的な結果は私が探していたものを得た。
Xmojmr、あなたの最後の答えもこの質問に対する答えでした。ありがとう。