gpt4 book ai didi

c# - 如何过滤 IQueryable 的嵌套项?

转载 作者:太空狗 更新时间:2023-10-29 18:26:30 26 4
gpt4 key购买 nike

我正在构建 Expression<Func<Project, bool>> 类型的表达式返回正确的 IQueryable<Project>从数据库。 IQueryable<Project>有一个 SubProjects 的嵌套集合我也想过滤。看起来像这样

这可以通过一次调用数据库来完成吗?

例如:

Expression<Func<Project, bool>> projectFilter = FilterEnabled();

projectFilter = projectFilter.And(GetProjectsByOrganization());

var projectData = GetProjectsAsQueryable(projectFilter); //returns correct projects

这是我想做的:

Expression<Func<Project, bool>> projectFilter = FilterEnabled();

projectFilter = projectFilter.And(GetProjectsByOrganization())
.And(GetSubProjectsByStartDate());

var projectData = GetProjectsAsQueryable(projectFilter); //returns correct projects and the filtered sub projects by start date

GetProjectsByOrganization如下

public Expression<Func<Project, bool>> GetProjectByOrganization()
{
var organizationIDs = new List<Guid>();

if (FilterCriteria.OrganiazaitonId != null)
organizationIDs = OrganizationRepository.GetParentAndChildrenOrganizationIds(FilterCriteria.OrganiazaitonId.Value).ToList();

//...

return prj => FilterCriteria.OrganiazaitonId == null || organizationIDs.Contains(prj.OrganizationID.Value);
}

如何添加 Expression<Func<SubProject, bool>>过滤器?如果不能,我有什么选择?

最佳答案

您应该能够使用 Expression.AndAlso 将所有 3 个表达式组合成一个新表达式。使用 Expression.PropertyOrField,您可以传递您的 SubProject 而不是您的项目作为参数:

    static Expression<Func<Project, bool>> CombineFilterExpression(
Expression<Func<Project, bool>> firstProjectFilter,
Expression<Func<Project, bool>> secondProjectFilter,
Expression<Func<SubProject, bool>> subProjectFilter
)
{
//Create Project Parameter
var param = Expression.Parameter(typeof(Project));
//Create && Expression
var body = Expression.AndAlso(
Expression.Invoke(firstProjectFilter, param),
Expression.AndAlso( //Create second && Expression
Expression.Invoke(secondProjectFilter, param),
//Pass SubProject instead of Project
Expression.Invoke(subProjectFilter, Expression.PropertyOrField(param, nameof(Project.SubProject)))
)
);
//Make Lambda with Project parameter
return Expression.Lambda<Func<Project, bool>>(body, param);
}

关于c# - 如何过滤 IQueryable<T> 的嵌套项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44005337/

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