2016-12-30 113 views
1

我遇到了從我的數據庫中檢索正確數據集的問題。而我的知識還不足以讓它得到修復。在相關對象上過濾數據

我正在爲我的叔叔他的運輸公司創建一個應用程序。所以他有駕駛駕駛任務的駕駛員和駕駛員駕駛多個駕駛員的每個任務。因此,它看起來像:一個驅動程序具有零個或多個分配,但分配僅適用於一個驅動程序,並且分配具有多個驅動器,但驅動器僅適用於一個分配。

我想要做的是從一個月的月份獲取驅動程序的所有驅動器,因爲我需要將其導出到Excel中,並且我想在應用程序中創建每月概覽。這是我做的,從一個司機得到所有驅動器的所有時間:

public Chauffeur FindAlleOpdrachtenRitten(string id) 
{ 
    return _ctx.Users 
    .Include(o => o.Opdrachten) 
    .Include(o => o.Opdrachten.Select(x => x.Ritten)) 
    // .Where(o => o.Opdrachten.(r => r.Datum == DateTime.Now)) 
    .SingleOrDefault(x => (x.Id == id)); 
} 

或者把它放在一個(我的)SQL語句就應該是這樣的:

SELECT * FROM ICS.AspNetUsers as a 
    INNER JOIN ICS.Opdrachts as o on a.Id = o.ChauffeurID 
    INNER JOIN ICS.Rits as r on o.OpdrachtID = r.OpdrachtID 
    WHERE a.UserName = "[email protected]" 
    AND r.Datum > "1-12-2016"; 

的代碼片段allready顯示了我已經嘗試過的東西,並且不起作用(並且DateTime.Now只是爲了嘗試一些東西)。所以我正在尋找一些關於如何解決這個問題的指導。我正在尋找正確的方向嗎?我發現了一些其他問題或多或少都有相同的問題,但與我的情況還不夠接近。

導出到excel函數正在工作,但我的最終目標是通過不查詢所有表格行並僅查詢特定月份來保存數據庫。 我一直在想所有的行,過濾後的特定月份,但最終會消耗大量資源嗎? (幾年後)。

另請注意,我是荷蘭語。司機=司機,Opdracht =轉讓和麗特=驅動

感謝您的閱讀,希望幫助我:d

編輯:包括自己在工作,我得到所有必要的數據,但不能過濾的相關對象。因此,所有的驅動器,而不是驅動器的特定月份,因爲在那裏功能不起作用

+0

您可以使用DateTime比較運算符,它們將被轉換爲SQL。所以'.Where(o => o.Datum> = new DateTime(2016,12,01)'? – CodeCaster

+0

只需要將日期存儲爲日期問題已解決 – Strawberry

+0

Mhmm我可能已經解釋了它不清楚,但是datum屬性是驅動器(Rit)。所以chauffeur.opdrachten.ritten.date。司機是司機有多個任務和rit是一個驅動器。所以司機有屬性,如名字和姓氏,任務具有像屬性和地點和驅動器/ RIT有一個時間戳,驅動多少英里,所以 –

回答

0

Include不能被過濾。然而,將我解釋here,但更深層次的原因,你可以達到你想要的東西:

_ctx.Configuration.LazyLoadingEnabled = false; 
var user = _ctx.Users 
       .Where(u => u.Id == id) 
       .Select(u => new 
       { 
        User = u, 
        Opdrachten = u.Opdrachten, 
        Ritten = u.Opdrachten 
          .SelectMany(o => o.Ritten 
               .Where(r => r.Datum == DateTime.Now)) 
       }) 
       .SingleOrDefault(); 
return user?.User; 

查詢收集你需要到上下文的緩存中的所有數據和EF由關係修正它們彼此相連。因此,每個Opdracht將有一個Ritten集合,僅由今天的項目填充。

禁用延遲加載,否則當您訪問數據庫時,EF仍會從數據庫填充導航屬性。

+0

因爲沒有看到你已經提供瞭解決方案,我覺得很愚蠢。我確實閱讀了您發佈的鏈接,但我認爲這不適用於我的情況。非常感謝,我將其標記爲正確答案! (有一個「)」後面缺少.Where(u =>(u.Id == id))<==) –