Я думаю, что ваша проблема с типом T вашего PredicateBuilder - половина вашего предиката, если он действует на Foo, другая половина - на Bar.:
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
select new {Foo = foo, Bar = bar};
if (searchName)
{
query = query.Where(fb => fb.Foo.Name == "fooname");
}
if (searchDescription)
{
query = query.Where(fb => fb.Bar.Description == "barstring");
}
// use query here
}
Альтернативный метод - использовать PredicateBuilder, но заставить его работать на паре Foo, Bar - например,
class FooBar
{
public Foo Foo {get;set;}
public Bar Bar {get;set;}
}
void Test(bool searchName, bool searchDescription)
{
IQueryable<Foo> fooQuery = null; // Stubbed out
IQueryable<Bar> barQuery = null; // Stubbed out
var query =
from foo in fooQuery
join bar in barQuery on foo.FooId equals bar.FooId
select new FooBar
{
Foo = foo,
Bar = bar
};
var predicate = PredicateBuilder.False<FooBar>();
if (searchName)
{
predicate = predicate.Or(foobar => foobar.Foo.Name == "fooname");
}
if (searchDescription)
{
predicate = predicate.Or(foobar => foobar.Bar.Description == "barstring");
}
query = query.Where(predicate);
// use query here
}