首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于LinqKit的子查询谓词构建

基于LinqKit的子查询谓词构建
EN

Stack Overflow用户
提问于 2017-04-28 11:15:58
回答 1查看 1.5K关注 0票数 0

我正在努力解决如何使用引用父查询的子查询构建谓词。

示例:

我有两个班(当然是Foo和Bar )。

Bar的ReferenceId引用(在这个特殊情况下)Foo的Id。

代码语言:javascript
复制
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; }
}

我有DB上下文。

代码语言:javascript
复制
public class MyContext : DbContext
{
    public DbSet<Foo> Foos { get; set; }
    public DbSet<Bars> Bars { get; set; }
}

我想使用谓词生成器(如果可能的话)来创建这样的函数.它检查是否存在带有Foo Id的条形图。

我没有把Bar作为导航属性,所以我需要直接访问上下文。

代码语言:javascript
复制
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

这是我写的

代码语言:javascript
复制
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实体查询表达式中。

如果删除A行或B行,则执行时会出现错误。对他们来说,这会抛出异常。

有人能提供一些关于我应该做些什么来达到这个目标的意见吗?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-28 15:02:40

好像我就快到了。我只需要翻转行A和B。

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43678914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档