2011-01-07 7 views
2

感謝:それは低下し、エラーを与える「= mailMergeItems」になると 現在、私は問題leppieに

Expression<Func<vwMailMerge,bool>> whereClause= null; 
List<vwMailMerge> mailMergeItems = null; 

int personType = mailMergeSettings.PersonType.ToInteger(); 
if (personType > 0) 
{ 
    whereClause = this.MailMergeWhereClause(whereClause, f => f.MemberTypeId == personType); 
} 
if (mailMergeSettings.PersonIds != null) 
{ 
    var personIds = mailMergeSettings.PersonIds.ToGuidArray(); 
    if (personIds != null && personIds.Length > 0) 
    { 
     var personList = personIds.ToList(); 
     whereClause = this.MailMergeWhereClause(whereClause, f => personList.Contains(f.UserId)); 
    } 
} 

mailMergeItems = this.ObjectContext.vwMailMerges.Where(whereClause).ToList(); 
private Expression<Func<vwMailMerge, bool>> MailMergeWhereClause(params Expression<Func<vwMailMerge, bool>>[] wheres) 
{ 
    if (wheres.Length == 0) 
    { 
     return x => true; 
    } 
    Expression result; 
    if (wheres[0] == null) 
    { 
     result = wheres[1].Body; 
     return Expression.Lambda<Func<vwMailMerge, bool>>(result, wheres[1].Parameters); 
    } 
    else 
    { 
     result = wheres[0].Body; 
     for (int i = 1; i < wheres.Length; i++) 
     { 
      result = Expression.And(result, wheres[i].Body); 
     } 
     return Expression.Lambda<Func<vwMailMerge, bool>>(result, wheres[0].Parameters); 
     }  
    } 
} 

を得ましたエンティティクエリ式に。

私は唯一の人々のために、またはのみmembertypeIdをチェックするときに、それが正しく動作していることに気づいた..しかし、第二は、それの「F =>」私が思うにエラーを与える組み合わせました。

答えて

0

あなたはより良いコードツールであなたの質問を再フォーマットできます。あなたの周りに浮いこれらすべてのFUNC表現を避けるために、このように問題にアプローチできように見えるしかし

this.ObjectContext.vwMailMerges.Where(mm=>IsValidMailMerge(mm,personType)).ToList() 


private bool IsValidMailMerge(YourType mailmerge, YourType2 personType) 
{ 
if(...) // type specific criteria here 
return true; 
else 
return false; 
} 
+0

where節に追加される場所がたくさんありますので、これは良い方法だと思います。 –

+0

それは表現ベースのシステムであれば、あなたはレッピーのアイデアを出しています。基本的にExpressionは条件用のC#ラムダコードであり、Funcはclrメソッドに組み込まれた式です。式は簡単に渡すことができますが、使用するために実行時に構築する必要があります。詳細はこちらhttp://msdn.microsoft.com/en-us/library/bb397951.aspx – Kaido

+0

最後に、WhereClauseを投げ捨てました。 ほとんどの場合、プランの変更によってセクション全体が改訂されていました。 これを解決策として使用しています。 –

2

あなたはFuncを使用傾ける、あなたはExpression<Func>を使用する必要があります。

+Expression.Andを介して行うことができます。

更新(テストしていません):

Expression<Func<vwMailMerge, bool>> whereClause = null; 
... 
Expression<Func<vwMailMerge, bool>> MailMergeWhereClause(
    params Expression<Func<vwMailMerge, bool>>[] wheres) 
{ 
    if (wheres.Length == 0) return x => true; 
    Expression result = wheres[0].Body; 
    for (int i = 1; i < wheres.Length; i++) 
    { 
    //probaby needs a parameter fixup, exercise for reader 
    result = Expression.And(result, wheres[i].Body); 
    } 
    return Expression.Lambda<Func<vwMailMerge,bool>>(result, wheres[0].Parameters); 
} 

アップデート2:

上記のアプローチは、私が期待通りに失敗しました。 ExpressionVistorクラスを使用して.NET 4で解決するのは簡単でしょう。 .NET 3.5の場合(または上記があまりにも難しい場合)は、次のように動作するはずです。

somequery.Where(x => x.foo).Where(x => x.bar).Where(x => x.baz) 

IOW、必要に応じて、あなただけのそれらを追加することができますが、それはロジック/フローにいくつかの変更が必要になります:

アプローチは、あなたがで終わるので、直接IQueryableでwhere句を追加していますあなたが貼り付けたコードの

+0

例えば任意のチャンス? –

+0

@Theun:私はそれを修正していたと言いましたが、修正されましたが、未完成の可能性があります。 – leppie

+0

申し訳ありませんが、正しく読まれませんでした! –