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