net linq join predicatebuilder

linq - net - ¿Puede PredicateBuilder generar predicados que abarquen varias tablas?



linq predicate (1)

Creo que tu problema es con el tipo T de tu PredicateBuilder: la mitad de tu predicado si actúas en un Foo, la otra mitad está en un Bar.

Puede reemplazar esto con una simple consulta construida manualmente:

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 }

Un método alternativo es usar PredicateBuilder pero para hacerlo funcionar en el Foo, Bar couple - por ejemplo

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 }

Me gustaría generar dinámicamente predicados que abarquen varias tablas en una unión en una instrucción Linq. En el siguiente fragmento de código, quiero usar PredicateBuilder o una construcción similar para reemplazar la instrucción ''where'' en el siguiente código:

Reemplazar:

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

Con algo como:

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

¿Algún pensamiento, idea, estrategia para enfrentar este problema?

Gracias,

EulerOperator