感謝:それは低下し、エラーを与える「= 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 =>」私が思うにエラーを与える組み合わせました。
where節に追加される場所がたくさんありますので、これは良い方法だと思います。 –
それは表現ベースのシステムであれば、あなたはレッピーのアイデアを出しています。基本的にExpressionは条件用のC#ラムダコードであり、Funcはclrメソッドに組み込まれた式です。式は簡単に渡すことができますが、使用するために実行時に構築する必要があります。詳細はこちらhttp://msdn.microsoft.com/en-us/library/bb397951.aspx – Kaido
最後に、WhereClauseを投げ捨てました。 ほとんどの場合、プランの変更によってセクション全体が改訂されていました。 これを解決策として使用しています。 –