LINQ:如何构建IQueryable<;CustomMadeType>;基于实体属性的搜索条件,包括多对多关系

LINQ:如何构建IQueryable<;CustomMadeType>;基于实体属性的搜索条件,包括多对多关系,linq,many-to-many,iqueryable,Linq,Many To Many,Iqueryable,我努力构建并轻松找到正确的信息,以定义多对多标准的LINQ表达式,因此Q&A 请修改/改进/更正/ 基本情况: Net实体框架代码优先 我们与UnitOfWork回购公司合作,但这在这里并不重要 我们定义了一个IQueryable查询 用户通过表单提交其搜索条件,每个条件直接匹配MyCustomMadeEntity的属性,或与MyCustomMadeEntity有多对多关系的另一个实体的属性,例如: (如果LocationType是自定义的枚举 构建一个基IQueryable表示数据库源以及

我努力构建并轻松找到正确的信息,以定义多对多标准的LINQ表达式,因此Q&A

请修改/改进/更正/

基本情况:

  • Net实体框架代码优先
  • 我们与UnitOfWork回购公司合作,但这在这里并不重要
  • 我们定义了一个
    IQueryable
    查询
  • 用户通过表单提交其搜索条件,每个条件直接匹配MyCustomMadeEntity的属性,或与MyCustomMadeEntity有多对多关系的另一个实体的属性,例如:
(如果LocationType是自定义的枚举

  • 构建一个基
    IQueryable
    表示数据库源以及基表与其他表(join等)的链接

  • Thx@marc_s用于编辑
    public class MyCustomMadeEntity : BaseEntity
    {
        public string ArticleCode { get; set; }
        public string Comment { get; set; }
        public Guid? ColorId { get; set; }
        public ArticleColor Color { get; set; }
    
        public ICollection<ArticleStatus> ArticleStatuses { get; set; }
    }
    
    public class MyCustomMadeEntity : BaseEntity
    {
        // properties
        Public LocationType LocationType { get; set; }
    }
    
    IQueryable<CustomMadeEntity> query = _UnitOfWork. ustomMadeEntityRepository
                        .Queryable()
                        .Include(el => el.OtherEntity);
    query = PerformAdvancedSearch(criteria, query);
    
    public static IQueryable<CustomMadeEntity> PerformAdvancedSearch(SearchRequestDto criteria, IQueryable< CustomMadeEntity > query) 
    {
        if (!string.IsNullOrWhiteSpace(criteria.ArticleCode))
        {
            query = query.Where(el => el. ArticleCode == criteria. ArticleCode));
        }
    }
    
    if (something) 
    {
        query = query.Where(el => el.ArticleStatuses.OrderByDescending(el => el.CreatedOn).Any() &&
                                  el.ArticleStatuses.OrderByDescending(el => el.CreatedOn)
                     .FirstOrDefault().LocationType == criteria.LocationType);                  
    }