Может ли PredicateBuilder генерировать предикаты, охватывающие несколько таблиц?

Я хотел бы динамически генерировать предикаты, которые охватывают несколько таблиц в операторе Join в операторе Linq. В следующем фрагменте кода я хочу использовать PredicateBuilder или аналогичную конструкцию для замены оператора where в следующем коде:

Заменить:

public class Foo
{
    public int FooId;  // PK
    public string Name;
}

public class Bar
{
    public int BarId;  // PK
    public string Description;
    public int FooId;  // FK to Foo.PK
}

void Test()
{
    IQueryable<Foo> fooQuery = null;    // Stubbed out
    IQueryable<Bar> barQuery = null;    // Stubbed out

    IQueryable<Foo> query =
        from foo in fooQuery
        join bar in barQuery on foo.FooId equals bar.FooId
        where ((bar.Description == "barstring") || (foo.Name == "fooname"))
        select foo;
}

на что-то вроде:

void Test(bool searchName, bool searchDescription)
{
    IQueryable<Foo> fooQuery = null;    // Stubbed out
    IQueryable<Bar> barQuery = null;    // Stubbed out

    IQueryable<Foo> query =
        from foo in fooQuery
        join bar in barQuery on foo.FooId equals bar.FooId
        select foo;

    // OR THIS

    var query =
        from foo in fooQuery
        join bar in barQuery on foo.FooId equals bar.FooId
        select new {foo, bar};

    var predicate = PredicateBuilder.False<Foo>();
    if (searchName)
    {
        predicate = predicate.Or(foo => foo.Name == "fooname");
    }
    if (searchDescription)
    {
        // Cannot compile
        predicate = predicate.Or(bar => bar.Description == "barstring");
    }
    // Cannot compile
    query = query.Where(predicate);
}

Любые мысли, идеи, стратегии для решения эта проблема?

Спасибо,

EulerOperator

6
задан EulerOperator 14 March 2011 в 19:13
поделиться