0

次のコードが機能しています

var queryResults = _db.Projects
           .Include("Participants.Person")
           .Where(Project => Project.Participants.Any(Parti => Parti.Person.FirstName == "test3"));

ラムダ式を動的に構築しています。上記を達成するために、私はたくさんのコードを書かなければなりません。

以下を実現したいと思います。

var queryResults = _db.Projects
           .Include("Participants.Person")
           .Where(Project => Project.Participants.Person.FirstName == "test3"));

提案があれば共有してください。

以下のセクションを編集

任意の操作で試しています。しかし、この行で例外が発生しています。助言がありますか?

MemberExpression propertyOuter = Expression.Property(c, "参加者");

ParameterExpression tpe = Expression.Parameter(typeof(Participant), "Participant");
Expression left1 = Expression.Property(tpe, typeof(Participant).GetProperty("Person"));
Expression left2 = Expression.Property(left1, typeof(Person).GetProperty("FirstName"));
Expression right1 = Expression.Constant(filter.FieldValue);
Expression InnerLambda = Expression.Equal(left2, right1);
Expression<Func<Participant, bool>> innerFunction = Expression.Lambda<Func<Participant, bool>>(InnerLambda, tpe);

MethodInfo method = typeof(Enumerable).GetMethods().Where(m => m.Name == "Any" && m.GetParameters().Length == 2).Single().MakeGenericMethod(typeof(Participant));

MemberExpression propertyOuter = Expression.Property(c, "Participant");

var anyExpression = Expression.Call(method, propertyOuter, innerFunction);
4

2 に答える 2

0

おそらくこれはあなたのために働いています。

var queryResults = _db.Persons
   .Where( p => p.FirstName == "test3")
   .SelectMany(p => p.Participant.Projects)
   .Include("Participants.Person"); 

編集:または、参加者が多い場合

var queryResults = _db.Persons
   .Where( p => p.FirstName == "test3")
   .SelectMany(p => p.Participants.SelectMany(par => par.Projects))
   .Include("Participants.Person"); 
于 2012-11-02T13:51:36.410 に答える
0

私は解決策を得ました、それは働いています。

ラムダ式

var queryResults = _db.Projects
       .Include("Participants.Person")
       .Where(Project => Project.Participants.Any(Participant => Participant.Person.FirstName == "test3"));

動的ラムダ式を構築するソース コード

 ParameterExpression c = Expression.Parameter(typeof(T), entityType.Name);
 ParameterExpression tpe = Expression.Parameter(typeof(Participant), "Participant");
 Expression left1 = Expression.Property(tpe, typeof(Participant).GetProperty("Person"));
 Expression left2 = Expression.Property(left1, typeof(Person).GetProperty("FirstName"));
 Expression right1 = Expression.Constant(filter.FieldValue);
 Expression InnerLambda = Expression.Equal(left2, right1);
 Expression<Func<Participant, bool>> innerFunction = Expression.Lambda<Func<Participant, bool>>(InnerLambda, tpe);

 MethodInfo method = typeof(Enumerable).GetMethods().Where(m => m.Name == "Any" && m.GetParameters().Length == 2).Single().MakeGenericMethod(typeof(Participant));

 var outer = Expression.Property(c, typeof(Project).GetProperty("Participants"));

 var anyExpression = Expression.Call(method, outer, innerFunction);

これは大いに役立ちました。コレクション プロパティでフィルター処理する動的式ツリーの構築

于 2012-11-05T12:54:08.197 に答える