如何解决Linq谓词匹配多层嵌套集合中的对象
我有:
public class TotalPeriod
{
public ICollection<SubPeriod> SubPeriods { get; set; }
....
}
public class SubPeriod
{
public ICollection<SmallerSubPeriod> SmallerSubPeriods { get; set; }
....
}
public class SmallerSubPeriod
{
public Payment Payment { get; set; }
....
}
public class Payment
{
public string PaymentCode { get; set; }
....
}
我需要编写一个谓词构建器来过滤PaymentCode
,该var predicate = PredicateBuilder.True<TotalPeriod>();
...// other logic
var paymentCodes = new HashSet<string>();
... // other logic to successfully get list of paymentCodes from UI
if(paymentCodes.Any())
{
predicate = predicate.And(entity => entity.SubPeriods.Any(e => e.SmallerSubPeriods.Any(e => paymentCodes.Contains(e.Payment.PaymentCode))));
}
可以从字符串列表中找到。
这是我所做的,但仍返回所有结果:
public static class PredicateBuilder
{
public static Expression<Func<T,bool>> True<T>() { return f => true; }
public static Expression<Func<T,bool>> And<T>(this Expression<Func<T,bool>> expr1,Expression<Func<T,bool>> expr2)
{
var invokedExpr = Expression.Invoke(expr2,expr1.Parameters);
return Expression.Lambda<Func<T,bool>> (Expression.AndAlso(expr1.Body,invokedExpr),expr1.Parameters);
}
}
编辑:
通用谓词构建器:
public async Task<ApiResponse<T>> GetManyAsync<T>(Expression<Func<TDAL,bool>> predicate,ICollection<string> includes = null) where T : class
{
try {
var expression = Expression.Convert(predicate.Body,typeof(bool));
var lambda = Expression.Lambda<Func<TDAL,bool>>(expression,predicate.Parameters);
using var dbContext = GetDatabaseContext();
var entities = await dbContext.Set<TDAL>().Where(lambda).AsNoTracking().ToArrayAsync();
... // other logic
} catch (Exception e) {
return DataProviderException.CatchException<T>(e);
}
}
谓词的应用方式:
class Player extends Component {
state = {
loading: true,karma: 0,username: "",};
componentDidMount() {
setInterval(loadData,60 * 1000);
}
async loadData() {
const url = `https://api.hypixel.net/player?key=INSERTAPIKEYHERE&name=${this.props.username}`;
const response = await fetch(url);
const data = await response.json();
if (!data.player) {
this.setState({
loading: false,karma: "There is no data for that player!",username: "There is no data for that player!",});
} else {
this.setState({
loading: false,karma: ",Karma: " + data.player.karma,username: "Username: " + data.player.displayname,});
}
}
render() {
return (
<div>
{this.state.loading ? (
<p>Loading...</p>
) : (
<p>
{this.state.username}
{this.state.karma}
</p>
)}
<button onClick={loadData}>Refresh</button>
</div>
);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。