【问题标题】:How to search and load data in database by using a string keyword如何使用字符串关键字在数据库中搜索和加载数据
【发布时间】:2015-08-05 14:37:16
【问题描述】:

这是我的ProgramCategories 模型

public class ProgramCategories
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int id { get; set; }
    public string courseCategory { get; set; }
}

这是我的课程信息模型。

public class CourseCategory
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    [Required(ErrorMessage = "Please Select Field of Study")]
    [Display(Name = "Field of Study")]
    public string courseField { get; set; }

    [Required(ErrorMessage = "Please Select Course Name")]
    [Display(Name = "Course Name", Prompt = "Course Name")]
    public string courseName { get; set; }

    [Display(Name = "Attachments")]
    public virtual ICollection<File> Files { get; set; }
    public virtual ICollection<FilePath> FilePaths { get; set; }
}

ProgramCategories 中的courseCategory 等于CourseCategory 中的courseField。每当保存课程信息时,我都可以通过下拉菜单选择课程类别。下拉列表包含所有 ProgramCategories。我将所有程序类别(例如:银行课程、科学课程等)加载到索引视图中。 所有这些事情目前都在起作用。

我想知道的是,当我单击一个programCategory 时,我想显示该类别中的所有课程。例如:如果我选择科学课程,我想获得所有的科学课程。

【问题讨论】:

  • 这不是问题。你只说你想要的。有什么问题?
  • 您需要该类别的相关课程合集
  • @GertArnold 我需要的是我的索引和视图应该如何?我不知道这样做。我是 MVC 新手。

标签: asp.net-mvc razor entity-framework-6


【解决方案1】:

这就是我的处理方式......

    public ActionResult CourseByCategory(string crsCtgry)
    {
       return View(getCourseByCategory(crsCtgry));
    }
    private List<CourseCategory> getCourseByCategory(string crsCtgry)
    {
        return db.CourseCategory.Where(n => n.courseField == crsCtgry).Select(n => n).ToList();
    }

【讨论】:

  • 你知道我的观点应该是怎样的吗?现在我对创建视图感到困惑。
  • 我做到了@BilRuhl。非常感谢。 :)
  • 很高兴我能帮上忙。
【解决方案2】:

您所描述的是一对多关系,因此请照此处理。在两个表之间创建一个真正的外键,然后您可以通过 Entity Framework 中的预加载或延迟加载自动拉入属于某个类别的课程:

public class ProgramCategories
{
    ...

    public virtual ICollection<CourseCategory> Courses { get; set; }

}

public class CourseCategory
{
    ...

    [ForeignKey("Category")]
    public int CategoryId { get; set; }
    public virtual ProgramCategories Category { get; set; }

}

这里我使用了ProgramCategories 的主键作为外键。从技术上讲,您没有必须这样做。您仍然可以像使用 courseField 一样使用字符串;您只需要为该属性定义一个最大长度:

[ForeignKey("Category")]
[MaxLength(50)]
public string CourseField { get; set; }

否则,该属性将在数据库中表示为一个 NVARCHAR(MAX),不能被索引(它本质上与 TEXT 相同)。但是,最佳做法是关闭主键。

另外,你的班级命名很可怕。类应该是单数 ProgramCategoryProgramCategories,而您的 CourseCategory 名称实际上并不能描述这个类是什么。似乎Course 会更合适,因为看起来这就是您在此处实际定义的内容,但也许courseName 是另一个应该是外键的场景。当您命名您的类和这些类的属性时,您应该考虑如何阅读它。例如,“课程类别课程名称为‘Foo’。”没有意义,但是“课程名称是'Foo'。”很有意义。这将转化为:

public class Course
{
    public string Name { get; set; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多