2013-06-11 29 views
1

我使用下面的拉姆達代碼試圖訪問鏈接表中的字段:如何使用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

取決於你需要什麼,有幾個選項:

如果你想工作,其中的文檔的任何有一個截止日期> =起始日期:

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)); 

ll工作和只有文檔的截止日期> =開始日期,那麼它更棘手。一種方法是將查詢顛倒:

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

太棒了,謝謝!很好的解釋和例子! – ForeverLearningAndCoding