如何在实体框架查询中使用多表达式方法[重复]

Posted

技术标签:

【中文标题】如何在实体框架查询中使用多表达式方法[重复]【英文标题】:How to use multi expression methods in Entity Framework query [duplicate] 【发布时间】:2017-08-09 07:36:28 【问题描述】:

我在我的应用程序中多次使用相同的 EF 查询,所以我需要这样的东西:

private Expression<Func<Student, bool>> StudentIsActive()

    return (x) => !x.IsDeleted && x.ItemsNumber > 0 && x.Sort > 0 && x.Status == StudentStatus.Active;


private Expression<Func<Student, bool>> StudentIsBusy()

    return (x) => x.Mode == ModeType.Busy && x.Jobs.Count() > 0;

我想在多个查询中使用相同的逻辑,例如:

 var students = context.Orders.Where(x => StudentIsActive() && StudentIsBusy()).ToList();

有人对此有任何想法吗?如何在表达式方法之间使用 ANDOR 逻辑?

【问题讨论】:

如果只需要And他们一起,只需再添加一个Where子句,例如:context.Orders.Where(StudentIsActive()).Where(StudentIsBusy()) @DavidG 谢谢,AND 的好解决方案 【参考方案1】:

我不在家,所以我无法测试它,我认为您可以将这些方法传输到 IQueryable 的扩展方法中,如下所示:

  public static class Ext
    
       public static IQueryable<MainActivity.Student> StudentIsActive(this IQueryable<MainActivity.Student> @this)
        
            return @this.Where(x => !x.IsDeleted && x.ItemsNumber > 0 && x.Sort > 0 && x.Status == StudentStatus.Active);
        

        public static IQueryable<MainActivity.Student> IsBusy(this IQueryable<MainActivity.Student> @this)
        
            return @this.Where(x.Mode == ModeType.Busy && x.Jobs.Count() > 0);
        

    

并像这样使用它:

context.Orders.StudentIsActive().IsBusy().ToList();

【讨论】:

这只是“和”而不是“或”,和我上面的评论也没有什么不同。【参考方案2】:

我通常发现And/OrExpressions 一起使用的最简单方法是使用LinqKit。引用该库后,您可以执行以下操作:

//Or
var orPredicate = PredicateBuilder.Or(StudentIsActive(), StudentIsBusy());
var orders1 = context.Orders.AsExpandable().Where(orPredicate);

//And
var andPredicate = PredicateBuilder.And(StudentIsActive(), StudentIsBusy());
var orders2 = context.Orders.AsExpandable().Where(andPredicate);

【讨论】:

投反对票的人能解释一下吗?

以上是关于如何在实体框架查询中使用多表达式方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用实体查询框架对以下查询进行建模

如何创建可重用的实体框架投影表达式?

查询 (LINQ) 表达式无法转换为实体框架核心

使用 SQL Server Compact 4.0 在实体框架中进行 LIKE 查询

使用带有实体框架的动态字段按子记录排序

在 EFCore 急切加载 LINQ 查询中,如何在 ThenInclude() 表达式中引用***实体?