使用 LinqKit 使用子查询构建谓词
Predicate Building with subquery using LinqKit
我正在研究如何使用引用父查询的子查询构建谓词。
示例:
我有 2 个 类(当然是 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; }
}
我想使用谓词生成器(如果可能的话)来创建这样的函数...检查是否存在具有 Foo 的 Id 的 Bar。
我没有导航栏 属性 所以我需要直接访问上下文。
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;
}
我找到了这个,(我认为)和我想要的相似,但又不一样。
Entity Framework Code First 4.3 / LINQKit predicate for related table
这是我写的
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;
}
但我收到错误消息:参数 '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;
}
我正在研究如何使用引用父查询的子查询构建谓词。
示例:
我有 2 个 类(当然是 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; }
}
我想使用谓词生成器(如果可能的话)来创建这样的函数...检查是否存在具有 Foo 的 Id 的 Bar。
我没有导航栏 属性 所以我需要直接访问上下文。
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;
}
我找到了这个,(我认为)和我想要的相似,但又不一样。
Entity Framework Code First 4.3 / LINQKit predicate for related table
这是我写的
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;
}
但我收到错误消息:参数 '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;
}