我有一个包含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()
,但我收到了这个错误:
"类型为'BACTERIA_EVW'的表达式在源类型为' DbSet'的查询表达式中的后续from子句中不允许使用。呼叫' SelectMany'"
时,类型推断失败如何在仍然没有记录的情况下正确选择最新记录?我认为将其分解为多个linq查询会更简单,但如果可能的话,我宁愿在单个数据库调用中执行此操作。
ETA - 这是使用SQL Server中加载的ESRI地理数据库,使用实体框架"代码首先来自数据库"模型,(我相信)不允许使用该方法导航属性。
答案 0 :(得分:3)
你快到了。
更换
.DefaultIfEmpty()
使用
进行调用.OrderByDescending(b => b.SAMPLEDATETIME).FirstOrDefault()
很好。但它会将结果类型从序列更改为单个项目,因此您还需要使用let
关键字替换相应的from
关键字,您就完成了。