【问题标题】:Sub Query Using Lambda Expression or Comprehension Syntax使用 Lambda 表达式或理解语法的子查询
【发布时间】:2017-03-13 15:46:35
【问题描述】:

我是 MVC 和 EF 的新手。我正在遵循数据库优先方法。我的数据库中有 2 个名为 tblSubject 和 tblPrerequisite 的表。我使用 EF 将它们映射到我的应用程序。这是两个图表的图片:

现在我需要执行如下所示的查询:

select Sc from tblSubject where Sc not in (Select Prerequisite from tblPrerequisite where Sc = @subjectCode) and Sc != @subjectCode

这个查询应该检索所有尚未作为先决条件分配给我作为参数传递的主题的主题。第二个条件应该过滤掉主题本身——因为它满足第一个条件——。我需要知道如何使用 Lambda 表达式或理解语法来做到这一点。可以的话请帮忙

编辑:这是我映射的主题类的代码

 public partial class Subject
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Subject()
    {
        this.tblSubjectScores = new HashSet<SubjectScore>();
        this.Prerequisite = new HashSet<Subject>();
        this.IsPrerequisiteFor = new HashSet<Subject>();
        this.tblSubject_Program = new HashSet<Subject_Program>();
    }

    public string Sc { get; set; }
    public string Name_EN { get; set; }
    public string Name_AR { get; set; }
    public byte CCH { get; set; }
    public string Description { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<SubjectScore> tblSubjectScores { get; set; }
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Subject> Prerequisite { get; set; }
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Subject> IsPrerequisiteFor { get; set; }
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Subject_Program> tblSubject_Program { get; set; }
}

这是我用于测试的操作方法

 public ActionResult Index()
    {
        Subject s = db.Subjects.FirstOrDefault(x => x.Sc == "Acc102");
        var notYetAssigned = db.Subjects.Where(x => s.Prerequisite.Any(y=> y.Sc == s.Sc && y.Sc!=x.Sc) && x.Sc != s.Sc).ToList();
        return View(notYetAssigned);
    }

【问题讨论】:

    标签: c# sql-server entity-framework lambda


    【解决方案1】:

    我不完全确定我是否遵循您的要求,但这是我的尝试:

    tblSubject.Where(s => tblPrerequisite.Any(p => p.Sc != sc) && s.Sc != sc).ToList()
    

    见工作小提琴here

    【讨论】:

    • 不幸的是,这两个表已被映射为一个,但具有 2 个导航属性。 tblsubject1 是指某个主题对象的先决条件集合,而 tblsubjects 是指某个主题对象作为先决条件的主题集合。
    • 您应该在原始帖子中显示您的课程的代码。
    • 我按照你的要求做了。还有什么需要的吗?
    • 我仍然认为我发布的内容应该可以,你有什么问题?
    • 在我问这个问题之前,我写了一些类似于你提出的内容,它给了我这个错误:无法创建类型为“GFIS.Models.Subject”的常量值。此上下文仅支持原始类型或枚举类型。我检查了 SQL Server Profiler,发现查询只返回了被认为是我选择的主题的先决条件的主题。当我尝试将该列表传递给具有 Subject 模型类的视图时,它给了我这个错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多