2

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);
        }     
    }
}

「mailMergeItems =" に達すると、ドロップして次のエラーが表示されます。「パラメーター 'f' は、指定された LINQ to Entities クエリ式にバインドされていません。」

人のみ、またはmembertypeIdのみをチェックすると、正しく機能することに気付きました..しかし、2番目を組み合わせると、「f =>」でエラーが発生すると思います。

4

2 に答える 2

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 の場合 (または前述の方法が難しすぎる場合)、次のように動作するはずです。

このアプローチは、 where 句をIQueryable直接追加することで、最終的には次のようになります。

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

IOW、必要に応じて追加できますが、貼り付けたコードのロジック/フローにいくつかの変更が必要になります。

于 2011-01-07T11:20:52.260 に答える
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;
}
于 2011-01-07T11:24:27.250 に答える