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