簡體   English   中英

LINQ-多個左外部聯接僅用於最新記錄

[英]LINQ - multiple left outer joins for most recent records only

我有一個帶有3個子表的示例站點表,每個子站點可以有多個記錄。 我需要做一個左外部聯接,所以即使它們沒有關聯的子記錄(其中一個表現在為空),我仍將獲得所有示例站點。 根據我對SO所做的一些研究,我做到了:

SampleSiteDataViewModel viewModel = 
            (from s in db.SAMPLESITES_EVW
            from b in db.BACTERIA_EVW.Where(b => b.FIELDSITEID == fieldSiteId).DefaultIfEmpty()
            from c in db.CHEMISTRY_EVW.Where(c => c.FIELDSITEID == fieldSiteId).DefaultIfEmpty()
            from m in db.MACROS_EVW.Where(m => m.FIELDSITEID == fieldSiteId).DefaultIfEmpty()
            where s.FIELDSITEID == fieldSiteId
            select new SampleSiteDataViewModel
                {
                    MPN_ECOLI = b.MPN_ECOLI,
                    DO_PERCENT = c.DO_PERCENT,
                    PH = c.PH,
                    TDS = c.TDS,
                    TEMP_C = c.TEMP_C,
                    OE = m.OE,
                    DESCRIP = s.DESCRIP
                }).FirstOrDefault();

但是,我意識到,如果有多個記錄,這不一定會返回最新的細菌/化學/宏觀記錄,因為它不是一對一的關系。 因此,我嘗試將.DefaultIfEmpty替換為.OrderByDescending(b => b.SAMPLEDATETIME).FirstOrDefault() ,但出現此錯誤:

“在源類型為'DbSet'的查詢表達式的后續from子句中,不允許類型'BACTERIA_EVW'的表達式。在對'SelectMany'的調用中類型推斷失敗

在仍然考慮不存在任何記錄的情況下,如何僅正確選擇最新記錄? 我認為將其分解為多個linq查詢會更簡單,但如果可能,我寧願在單個數據庫調用中進行。

ETA-使用的是使用實體框架“數據庫優先編碼”模型在SQL Server中加載的ESRI地理數據庫,(我認為)該模型不允許使用該方法的導航屬性。

你快到了。

更換

.DefaultIfEmpty()

打電話給

.OrderByDescending(b => b.SAMPLEDATETIME).FirstOrDefault()

很好 但是它將結果類型從序列更改為單個項目,因此您還需要用let關鍵字替換from關鍵字中的相應內容from然后就可以完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM