C# 使用LinqKit使用子查询生成谓词

C# 使用LinqKit使用子查询生成谓词,c#,predicatebuilder,linqkit,C#,Predicatebuilder,Linqkit,我正在尝试解决如何使用引用父查询的子查询构建谓词 例如: 我有两门课(当然是Foo和Bar) Bar的ReferenceId引用(在这个特定实例中)Foo的Id public class Foo { public int Id { get; set; } public bool IsGood { get; set; } } public class Bar { public int Id { get; set; } public int ReferenceI

我正在尝试解决如何使用引用父查询的子查询构建谓词

例如:

我有两门课(当然是Foo和Bar)

Bar的ReferenceId引用(在这个特定实例中)Foo的Id

public class Foo
{
    public int Id { get; set; }

    public bool IsGood { get; set; }
}

public class Bar
{
    public int Id { get; set; }

    public int ReferenceId { get; set; }

    public bool IsSomething { get; set; }
}
我有一个数据库上下文

public class MyContext : DbContext
{
    public DbSet<Foo> Foos { get; set; }
    public DbSet<Bars> Bars { get; set; }
}
公共类MyContext:DbContext
{
公共DbSet Foos{get;set;}
公共DbSet条{get;set;}
}
我想使用谓词生成器(如果可能的话)来创建这样的函数。。。检查是否存在具有Foo Id的酒吧

public class Foo
{
    public int Id { get; set; }

    public bool IsGood { get; set; }
}

public class Bar
{
    public int Id { get; set; }

    public int ReferenceId { get; set; }

    public bool IsSomething { get; set; }
}
我没有作为导航属性的栏,所以我需要直接访问上下文

public static IQueryable<Foo> GetFooQuery(IQueryable<Foo> query, MyContext context)
{
    query = query.Where(f => f.IsGood)
                 .Where(f => context.Bars.Where(b => b.ReferenceId == f.Id)
                                         .Where(b => b.IsSomething)
                                         .Any());

    return query;
}
公共静态IQueryable GetFooQuery(IQueryable查询,MyContext上下文)
{
query=query.Where(f=>f.IsGood)
.Where(f=>context.bar.Where(b=>b.ReferenceId==f.Id)
.其中(b=>b.IsSomething)
.Any());
返回查询;
}
我发现了这个,它(我认为)与我想要的相似,但不一样

这是我写的

public static IQueryable<Foo> GetFooQuery(IQueryable<Foo> query, MyContext context)
{
    var barPredicateBuilder = PredicateBuilder.True<Bar>();
    barPredicateBuilder = barPredicateBuilder.And(b => b.IsSomething);

    var fooPredicateBuilder = PredicateBuilder.True<Foo>();
    fooPredicateBuilder = fooPredicateBuilder.And(f => f.IsGood);
    fooPredicateBuilder = fooPredicateBuilder.And(f => context.Bars
                                                              .Where(b => b.ReferenceId == f.Id) // A
                                                              .Where(barPredicateBuilder).AsExpandable() // B
                                                              .Any());

    query = query.Where(fooPredicateBuilder).AsExpandable();

    return query;
}
公共静态IQueryable GetFooQuery(IQueryable查询,MyContext上下文)
{
var barPredicateBuilder=PredicateBuilder.True();
barPredicateBuilder=barPredicateBuilder.And(b=>b.IsSomething);
var foodpredicatebuilder=PredicateBuilder.True();
foodpredicatebuilder=foodpredicatebuilder.And(f=>f.IsGood);
foodpredicatebuilder=foodpredicatebuilder.And(f=>context.bar
.其中(b=>b.ReferenceId==f.Id)//A
.Where(barPredicateBuilder).AsExpandable()//B
.Any());
query=query.Where(foodpredicatebuilder.AsExpandable();
返回查询;
}
但我得到了一个错误:参数“f”未绑定在指定的LINQ to Entities查询表达式中

如果我删除A行或B行,它将执行错误。对于这两种情况,它抛出了异常

任何人都可以提供一些意见,我应该做些什么来实现这一点


谢谢

看来我就快到了。我只需要把A线和B线翻转一下

public static IQueryable<Foo> GetFooQuery(IQueryable<Foo> query, MyContext context)
{
    var barPredicateBuilder = PredicateBuilder.True<Bar>();
    barPredicateBuilder = barPredicateBuilder.And(b => b.IsSomething);

    var fooPredicateBuilder = PredicateBuilder.True<Foo>();
    fooPredicateBuilder = fooPredicateBuilder.And(f => f.IsGood);
    fooPredicateBuilder = fooPredicateBuilder.And(f => context.Bars
                                                              .Where(barPredicateBuilder).AsExpandable() // B
                                                              .Where(b => b.ReferenceId == f.Id) // A
                                                              .Any());

    query = query.Where(fooPredicateBuilder).AsExpandable();

    return query;
}
公共静态IQueryable GetFooQuery(IQueryable查询,MyContext上下文)
{
var barPredicateBuilder=PredicateBuilder.True();
barPredicateBuilder=barPredicateBuilder.And(b=>b.IsSomething);
var foodpredicatebuilder=PredicateBuilder.True();
foodpredicatebuilder=foodpredicatebuilder.And(f=>f.IsGood);
foodpredicatebuilder=foodpredicatebuilder.And(f=>context.bar
.Where(barPredicateBuilder).AsExpandable()//B
.其中(b=>b.ReferenceId==f.Id)//A
.Any());
query=query.Where(foodpredicatebuilder.AsExpandable();
返回查询;
}