C# LINQ-仅用于最新记录的多个左外部联接

C# LINQ-仅用于最新记录的多个左外部联接,c#,.net,entity-framework,linq,linq-to-entities,C#,.net,Entity Framework,Linq,Linq To Entities,我有一个带有3个子表的示例站点表,每个示例站点可以有多个记录。我需要做一个左外部连接,这样我仍然可以得到所有的示例站点,即使它们没有关联的子记录(其中一个表现在是空的)。根据我所做的一些研究,我做了以下工作: SampleSiteDataViewModel viewModel = (from s in db.SAMPLESITES_EVW from b in db.BACTERIA_EVW.Where(b => b.FIELDSITEID

我有一个带有3个子表的示例站点表,每个示例站点可以有多个记录。我需要做一个左外部连接,这样我仍然可以得到所有的示例站点,即使它们没有关联的子记录(其中一个表现在是空的)。根据我所做的一些研究,我做了以下工作:

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()

很好。但是它将结果类型从序列更改为单个项,因此您还需要将相应的关键字替换为关键字,这样您就完成了。

@Gert Arnold-如果我理解您的问题(也许我不理解),这是因为这实际上是一个ESRI地理数据库,我们必须将模型添加为“数据库中的代码优先”所以它加载时没有任何导航属性。我想我一定是弄错了LINQ to SQL的含义。我将把标记更新为实体框架。