2016-09-19 78 views
0

我試圖告訴.NET創建一個新對象,從第一個數據集中獲取屬性並將連接的結果追加到其中一個屬性新創建的對象主表查詢返回結果,然後將結果附加到屬性

var projects = from p in projectSet //projectSet is DbSet<Project>.... 
       join lmp in LMProjects on p.ProjectID equals lmp.lmp_ProjectID 
       where p.UserID == value 
       select new Project { LMProject = lmp }; 

這裏有個致命的,我可以告訴它來創建一個新的對象,指定的連接(lmp),以它的一個屬性,但我怎麼告訴它使用的結果p的結果是否啓動新創建對象的所有其他值?這甚至可能沒有手動分配值(Project類中有大約30個...)

我想過這樣做,但那不是我正在尋找的。

var projects = from p in projectSet 
       join lmp in LMProjects on p.ProjectID equals lmp.lmp_ProjectID 
       where p.UserID == value 
       select new { Project = p, LMProject = lmp }; 

我這樣做的原因是我有一個沒有外鍵的數據庫,我試圖模擬導航屬性。 (我無法更改模型)

+0

這是最後一個查詢,即你需要它來保持IQueryable進一步處理嗎? –

+0

目前,我沒有任何制約。 –

+0

也許我不清楚。目前你的'var projects'的類型是'IQueryable '爲你工作嗎? –

回答

0

即使您想手動列出select子句中的所有字段,也不能直接執行該操作,因爲實體框架不允許投影到實體類型。

唯一可能的途徑是你的第二個執行LINQ到實體查詢方法結合了切換到LINQ agains數據庫對象方面,做了「修正」,並最終投射這樣的:

var query = from p in projectSet 
       join lmp in LMProjects on p.ProjectID equals lmp.lmp_ProjectID 
       where p.UserID == value 
       select new { Project = p, LMProject = lmp }; 
var projects = query.AsEnumerable().Select(r => 
{ 
    r.Project.LMProject = r.LMProject; 
    return r.Project; 
}; 

但請注意,這會將上下文和projects的類型更改爲IEnumerable<Project>。當然,您可以使用AsQueryable方法將它重新設置爲IQueryable<Project>,但它不再是真正的數據庫查詢,因此如果您應用其他過濾器,排序,分頁等,它們將全部發生在內存中(只有query部分將會針對數據庫執行)。