接受谓词和顺序的存储库方法

本文关键字:存储 方法 顺序 谓词 | 更新日期: 2023-09-27 18:04:28

我已经用实体框架建立了一个存储库,并有以下接口方法:

Task<IList<Person>> SearchForPeople(Expression<Func<Person, bool>> predicate, Expression<Func<Person, object>> orderBy);

这是相当基本的,我已经将其实现为:

public async Task<IList<Person>> SearchForPeople(Expression<Func<Person, bool>> predicate, Expression<Func<Person, object>> orderBy)
{
    return await this.context.People.Where(predicate).OrderBy(orderBy).ToListAsync();
}

我现在这样调用它:

var people = await repository.SearchForPeople(x => x.Born.Day == now.Day && x.Born.Month == now.Month, x => x.OrderingKey);

返回生日在指定日期/月份的所有人,然后根据一个名为"orderingKey"的属性对他们进行排序,该属性实质上是将他们的姓名连接起来。

这很好,但如果我试图改变顺序像这样:

var people = await repository.SearchForPeople(x => x.Born.Day == now.Day && x.Born.Month == now.Month, x => x.Born);

我得到一个错误,说我不能强制转换系统。DateTime到System.Object。我理解为什么会发生这种情况,因为我已经清楚地说明了orderderby属性应该是"对象"类型,但是我不知道如何重写它,以便我的orderderby接受任何类型的orderderby属性,而不使用泛型T重写整个东西,我真的不想这样做,因为我不想要一个泛型存储库,只是一个泛型过滤器!

是否有另一种方法使这两种类型的顺序工作?

接受谓词和顺序的存储库方法

您可以使该方法具有通用性:

public async Task<IList<Person>> SearchForPeople<T>(Expression<Func<Person, bool>> predicate, Expression<Func<Person, T>> orderBy)
{
    return await this.context.People.Where(predicate).OrderBy(orderBy).ToListAsync();
}

然后使用类型推断,下面应该可以工作:

var people = await repository.SearchForPeople(x => x.Born.Day == now.Day && x.Born.Month == now.Month, x => x.Born);

试试这个:

public async Task<IList<Person>> SearchForPeople<TOrderKey>(Expression<Func<Person, bool>> predicate, Expression<Func<Person, TOrderKey>> orderBy)
{
    return await this.context.People.Where(predicate).OrderBy(orderBy).ToListAsync();
}

不是传入"Object"而是将其定义为一个泛型参数