C# 使用LinqKit使用子查询生成谓词
我正在尝试解决如何使用引用父查询的子查询构建谓词 例如: 我有两门课(当然是Foo和Bar) Bar的ReferenceId引用(在这个特定实例中)Foo的IdC# 使用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
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();
返回查询;
}