如何使用lambda正确访问链接表字段

本文关键字:访问 链接表 字段 何使用 lambda | 更新日期: 2023-09-27 18:17:59

我正在尝试使用以下lambda代码访问链接表字段:

DateTime dtStartDate = "1/1/2013"; // or some date
var jobs = db.jobs.Include(d => d.docs)
                  .Where(d => d.docs.duedate >= dtStartDate);

下面是SQL Server中的表关系键:

jobs.JobID = docs.JobID
// Note: Check Existing Data = No.

那么当我尝试在第一个&中执行以下操作时,为什么上面的代码不起作用?上面第二行代码:

 // errors here
 // .duedate can't be found through the .Include() table, docs
 d.docs.duedate 

错误提示:

System.Collections.Generic。ICollection'不包含'duedate'的定义,也没有扩展方法'duedate'接受类型为'System.Collections.Generic '的第一个参数。可以找到ICollection(您是否缺少using指令或程序集引用?)

实体框架生成的类代码:

public partial class jobs
{
    public jobs()
    {
        this.docs = new HashSet<docs>();
    }
    public int JobID { get; set; }
    public virtual ICollection<docs> docs { get; set; }
}
public partial class docs
{
    public int DocumentID { get; set; }
    public Nullable<int> JobID { get; set; }
    public Nullable<System.DateTime> duedate { get; set; }
    public virtual jobs jobs { get; set; }
}

我已经在Visual Studio中更新了模型以匹配DB,但这仍然不起作用。知道为什么吗?非常感谢您的帮助。

如何使用lambda正确访问链接表字段

根据您的需要,有以下几个选项:

如果您想要的工作任何文档都有截止日期>=开始日期:

var jobs = db.jobs.Include(j => j.docs)
                  .Where(j => j.docs.Any(d => d.duedate >= dtStartDate));

如果您想要的工作所有文档都有截止日期>=开始日期:

var jobs = db.jobs.Include(j => j.docs)
                  .Where(j => j.docs.All(d => d.duedate >= dtStartDate));

如果你想要所有的作业和只有文档的截止日期>=开始日期,那么它是棘手的。一种方法是将查询倒过来:

var docs = db.docs.Include(d => d.job)
                  .Where(d => d.duedate >= dtStartDate)
                  .Select(d => d.job)
                  .Distinct();