Can PredicateBuilder generate predicates that span multiple tables?

前端 未结 1 1548
陌清茗
陌清茗 2021-01-12 23:22

I would like to dynamically generate predicates that span multiple tables across a Join in a Linq statement. In the following code snippet, I want to use PredicateBuilder o

相关标签:
1条回答
  • 2021-01-12 23:47

    I think your problem is with the type T of your PredicateBuilder - half of your predicate if acting on a Foo, the other half is on a Bar.

    You could replace this with a simple manually constructed query:

    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
    }
    

    An alternative method is to use PredicateBuilder but to make it work on the Foo,Bar couple - e.g.

    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
    }
    
    0 讨论(0)
提交回复
热议问题