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

时间:2013-06-11 18:27:37

标签: c# sql-server asp.net-mvc entity-framework

我正在尝试使用以下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中更新了模型以匹配数据库,但仍然无效。知道为什么吗?非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

根据您的需要,有以下几种选择:

如果您希望任何文档的作业具有截止日期&gt; =开始日期:

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

如果您希望所有文档的作业的截止日期&gt; =开始日期:

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

如果您想要所有工作而截止日期&gt; =开始日期的文档,那么它就更棘手了。一种方法是颠倒查询:

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