私のプロジェクトの目的のために、エンティティへの linq クエリが必要です。式ファクトリ メソッドを使用して動的フィルター述語を作成しています。
このコードを考えると:
public class mother{
public int age {get; set;}
public string name {get; set;}
public child child {get; set;}
}
public class child{
public int age {get; set;}
public string name {get; set;}
}
//predicate builder
public static Expression<Func<T, bool>> GetChildNamePredicat<T>(){
var param = Expression.Parameter(typeof(T), "param");
// age property of mother class
var motherAgeProperty = Expression.MakeMemberAccess(param, typeof(T).GetProperty("age"));
// name property of child class
var motherChildProperty = Expression.MakeMemberAccess(param, typeof (t).GetProperty("child"));
var childNameProperty = Expression.MakeMemberAccess(motherChildProperty , typeof (child).GetProperty("name "));
BinaryExpression motherAgeCondition;
BinaryExpression childNameCondition;
//building condition mother age >= 40 and child name = junior
var motherAgeConst = Expression.Constant(40, typeof(int));
var childNameConst = Expression.Constant("junior", typeof(string));
motherAgeCondition = Expression.GreaterThanOrEqual(motherAgeProperty, motherAgeConst);
childNameCondition= Expression.Equal(childNameProperty, childNameConst);
var mergeCondition = Expression.AndAlso(motherAgeCondition , childNameCondition);
//return expression
return Expression.Lambda<Func<T, bool>>(mergeCondition , param);
}
var myPredicate = GetChildNamePredicat<mother>();
このコードは正常にコンパイルされますが、関数ではないようで、結果はありません...「myPredicate」で変数のスパイを使用すると、次のようなラムダデバッグビューを見ることができます:
.Lambda
#Lambda1<System.Func`2[myNameSpace.mother,System.Boolean]>(myNameSpace.mothe $e) { $e.age >= 40 && ($e.child).name == "junior" }
($e.child) ... とても奇妙です
別の解決策を知っていますか、または/および母パラメーターから子名プロパティにアクセスすることについて何か考えがありますか?
事前にthx!