如何在Entity Framework查询中使用多表达式方法

时间:2017-03-17 16:32:24

标签: c# entity-framework

我在我的应用程序中多次使用相同的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();

有人对此有任何想法吗?我怎样才能在表达式方法之间使用 AND OR 逻辑?

2 个答案:

答案 0 :(得分:0)

我不在家,所以我不能测试它购买我认为你可以将这些方法转移到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();

答案 1 :(得分:0)

我通常发现And / Or Expression一起使用的最简单方法是使用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);