Consulta dinámica para crear un predicado con colección interna

Estoy creando capacidad de búsqueda para miMVC EF solicitud. Lo estoy creando usando una consulta dinámica. Y siguiendo este métodohttps://www.codeproject.com/Articles/493917/Dynamic-Querying-with-LINQ-to-Entities-and-Express

Es para crear un predicado parabool ystring campos de entidad. La entidad principal en mi aplicación esApplicant

EDMXApplicant está siguiendo

     public partial class Applicant
    {

      public Applicant()
       {
         this.ApplicantEducations = new HashSet<ApplicantEducation>();
         this.ApplicantSkills = new HashSet<ApplicantSkill>();
         this.Applications = new HashSet<Application>();
         this.Experiences = new HashSet<Experience>();
        }

    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public byte[] CV_Upload1 { get; set; }
    public string CV_Upload2 { get; set; }
    public string email { get; set; }
    public string password { get; set; }
    public Nullable<System.DateTime> DOB { get; set; }

   virtual ICollection<ApplicantEducation> ApplicantEducations { get; set; }
   virtual ICollection<ApplicantSkill> ApplicantSkills { get; set; }
   virtual ICollection<Application> Applications { get; set; }
   virtual ICollection<Experience> Experiences { get; set; }
}

Quiero buscar, es decir, con el nombre de la institución que está archivada en Solicitante Educación del tipo Instituto. El solicitante puede tener uno o varios objetos ApplicantEducations.

La siguiente es la clase EDMX de mi SolicitanteEducaciones

   public partial class ApplicantEducation
{
    public int id { get; set; }
    public Nullable<int> ApplicantId { get; set; }
    public Nullable<int> InstituteId { get; set; }
    public Nullable<int> EducationLevelId { get; set; }
    public Nullable<bool> IsComplete { get; set; }
    public Nullable<System.DateTime> DateStart { get; set; }
    public Nullable<System.DateTime> DateEnd { get; set; }
    public Nullable<short> GPA { get; set; }

    public virtual EducationLevel EducationLevel { get; set; }
    public virtual Institute Institute { get; set; }
    public virtual Applicant Applicant { get; set; }
}

Y mi clase de entidad del Instituto es así

public class Institute
  {
         public int Id { get; set; }
         public string Name { get; set; }

  }

Por lo tanto, el Usuario buscará especificando el Nombre del instituto y todos los solicitantes serán recuperados con educación de ese instituto.

Como mencioné anteriormente el enlace. Lo siguiente, por ejemplo, se demuestra para la construcción de predicados de campo de cadena

     private static Expression<Func<TDbType, bool>> ApplyStringCriterion<TDbType,
        TSearchCriteria>(TSearchCriteria searchCriteria, PropertyInfo searchCriterionPropertyInfo,
        Type dbType, MemberInfo dbFieldMemberInfo, Expression<Func<TDbType, bool>> predicate)
    {
        // Check if a search criterion was provided
        var searchString = searchCriterionPropertyInfo.GetValue(searchCriteria) as string;
        if (string.IsNullOrWhiteSpace(searchString))
        {
            return predicate;
        }
        // Then "and" it to the predicate.
        // e.g. predicate = predicate.And(x => x.firstName.Contains(searchCriterion.FirstName)); ...
        // Create an "x" as TDbType
        var dbTypeParameter = Expression.Parameter(dbType, @"x");
        // Get at x.firstName
        var dbFieldMember = Expression.MakeMemberAccess(dbTypeParameter, dbFieldMemberInfo);
        // Create the criterion as a constant
        var criterionConstant = new Expression[] { Expression.Constant(searchString) };
        // Create the MethodCallExpression like x.firstName.Contains(criterion)
        var containsCall = Expression.Call(dbFieldMember, StringContainsMethod, criterionConstant);
        // Create a lambda like x => x.firstName.Contains(criterion)
        var lambda = Expression.Lambda(containsCall, dbTypeParameter) as Expression<Func<TDbType, bool>>;
        // Apply!
        return predicate.And(lambda);
    }

el código anterior para construir un predicado para un campo de cadena simple contenido en la clase de entidad principal (solicitante). Pero el solicitante también tiene la colección ApplicantEducation, por lo que mi pregunta es cómo puedo crear una consulta dinámica (predicado) para la cláusula where (método) delinq así que cuando el usuario busque el nombre del instituto, todos los solicitantes serán recuperados con la misma educación.

Mis criterios de búsqueda se dan a continuación,

  public class SearchCriteriaVM
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime? DOB { get; set; }     
    public string Description { get; set; }

    public ICollection<Models.ApplicantEducationVM> ApplicantEducations { get; set; }
    public ICollection<Models.ExperienceVM> Experiences { get; set; }
    public ICollection<Models.ApplicantSkillsVM> ApplicantSkills { get; set; }

    public ICollection<Models.ApplicationsVM> Applications { get; set; }



}

Estoy un poco perdido, ¿cómo puede ser esto posible?

Gracias

Respuestas a la pregunta(2)

Su respuesta a la pregunta