【问题标题】:LINQ - multiple left outer joins for most recent records onlyLINQ - 仅用于最近记录的多个左外连接
【发布时间】:2017-01-18 19:45:24
【问题描述】:

我有一个包含 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 地理数据库,该模型(我相信)不允许使用该方法进行导航属性。

【问题讨论】:

  • @Gert Arnold - 如果我理解你的问题(也许我不理解),那是因为这实际上是一个 ESRI 地理数据库,我们必须将模型添加为“数据库中的代码”,所以它在没有任何导航属性的情况下加载它。
  • 我想我一定搞错了 LINQ to SQL 的含义。我会将标签更新为 Entity Framework。

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


【解决方案1】:

你快到了。

替换

.DefaultIfEmpty()

调用

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

没问题。但是它把结果类型从序列变成了单项,所以还需要把对应的from关键字替换成let关键字就大功告成了。

【讨论】:

    猜你喜欢
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 2010-09-09
    相关资源
    最近更新 更多