[英]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.