LINQ - 仅用于最近记录的多个左外连接

时间:2017-01-18 19:45:24

标签: c# .net entity-framework linq linq-to-entities

我有一个包含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地理数据库,使用实体框架"代码首先来自数据库"模型,(我相信)不允许使用该方法导航属性。

1 个答案:

答案 0 :(得分:3)

你快到了。

更换

.DefaultIfEmpty()

使用

进行调用
.OrderByDescending(b => b.SAMPLEDATETIME).FirstOrDefault()

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