【发布时间】: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