gpt4 book ai didi

c# - 接受谓词和 orderby 的存储库方法

转载 作者:太空狗 更新时间:2023-10-30 01:04:20 25 4
gpt4 key购买 nike

我已经使用 Entity Framework 设置了一个存储库,并具有以下接口(interface)方法:

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”的属性对他们进行排序,该属性本质上是他们的姓名串联。

这工作正常,但如果我尝试将 orderby 更改为如下内容:

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

我收到一条错误消息,提示我无法将 System.DateTime 转换为 System.Object。我明白为什么会发生这种情况,因为我已经明确指出 orderby 属性应该是“object”类型,但我看不出如何重写它以便我的 orderby 接受任何类型的属性来 orderby 而无需使用重写整个事物通用 T,我真的不想这样做,因为我不想要一个通用存储库,只是一个通用过滤器!

是否有另一种方法可以使这两种类型的 orderby 都起作用?

最佳答案

您可以只使该方法通用:

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);

关于c# - 接受谓词和 orderby 的存储库方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23778903/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com