0

次のコードを取得しました

public class Personnel {
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public int OrganizationalUnitId { get; set; }
    public int RoleId { get; set; }
}

private List<Expression<Func<Personnel, bool>>> personnelFilter;

public void AddFilter(Expression<Func<Personnel, bool>> filter)
{
    this.personnelFilter.Add(filter);
}

public IEnumerable<Personnel> GetResult()
{
    IQueryable<Personnel> personnel = Store.Instance.Query<Personnel>();
    foreach(var filter in this.personnelFilter)
    {
        personnel = personnel.Where(filter);
    }

    return personnel;
}

AND を使用するようになりました。これは、既にフィルター処理されたクエリに Where 句を追加するためです。しかし、AND ではなく OR として追加したいと思います。

それでは、フィルターを追加するとしましょう:

model.AddFilter(a => a.FirstName == "Test")
model.AddFilter(a => a.FirstName == "More")

// Or adding something stupid like:
model.AddFilter(a => a.OrganizationalUnit == 1)
model.AddFilter(a => a.OrganizationalUnit == 1)

次のクエリが必要です。

WHERE Firstname == "Test" || Firstname == "More"

せずに:

model.AddFilter(a => a.FirstName == "Test" || a.FirstName == "More")

これは可能ですか?つまり、式を含むリストを取得し、where 句で AND ではなく OR を使用したいのですが、それを機能させる方法が見つかりません。何か案は?

4

1 に答える 1

2

次のようにしてみてください: (コードが機能しませんでした)

これは逆のように見えますが、単なる反転ロジックです。B は !(!A && !B) と同じです。Except() は Where() の否定バージョンなので、問題ないはずです。


編集:私は働いており、次のように適切に組み合わせる必要があるようです:

public static Expression<Func<T, bool>> Combine_Or<T>(
    Expression<Func<T, bool>> expr1,
    Expression<Func<T, bool>> expr2)
{
    var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
    return Expression.Lambda<Func<T, bool>>
          (Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);
}

基本的にここから取得:ラムダ式とそれらを組み合わせる方法?

私の完全なテストコード: http://pastebin.com/cLXi77pf

于 2013-04-29T08:48:48.167 に答える