首页 > 解决方案 > 多对多关系过滤器/搜索

问题描述

您好,我想过滤到 LanguageSchool 表,但 LanguageSchool 表与 LanguageSchoolProgram 表有关系(多对多)。

public class LanguageSchool
{
    public virtual List<LanguageSchoolLanguageSchoolProgram> LanguageSchoolLanguageSchoolPrograms { get; set; }
}

public class LanguageSchoolProgram
{
     public long Id { get; set; }
     public virtual List<LanguageSchoolLanguageSchoolProgram> LanguageSchoolLanguageSchoolPrograms { get; set; }
}
public class LanguageSchoolLanguageSchoolProgram
{
    public long LanguageSchoolProgramId { get; set; }
    public virtual LanguageSchoolProgram LanguageSchoolProgram { get; set; }
    public long LanguageSchoolId { get; set; }
    public virtual LanguageSchool LanguageSchool { get; set; }
}

我有 X 语言学校计划、Y 语言学校计划和 Z 语言计划以及很多语言学校。

我想选择语言学校,但语言学校包含 X 和 Y 程序。

我必须使用.AsQueryable()功能。

标签: c#asp.net-coreentity-framework-core

解决方案


您的问题不清楚...我不确定您如何存储程序 X、Y、Z?我假设这些是程序名称。

您可以像这样定义多对多关系:

public class LanguageSchool
{
    public int LanguageSchoolId { get; set; }
    public virtual ICollection<LanguageSchoolProgram> LanguageSchoolPrograms { get; set; }
}

public class LanguageSchoolProgram
{
    public int LanguageSchoolProgramId { get; set; }
    public string ProgramName {get; set;} // this is X, Y or Z
    public virtual ICollection<LanguageSchool> LanguageSchools { get; set; }
}

并用于Contains选择列表中包含课程的学校:

string[] requiredPrograms = new string[] {"X", "Y", "X"};
var schoolsQueryable = dbContext.LanguageSchool.Where(
    ls => requiredPrograms.contains(ls.LanguageSchoolProgram.ProgramName));

// if you don't want Queryable, then add ToList()

推荐阅读