LINQ - 仅对最近的记录进行多个左外连接
LINQ - multiple left outer joins for most recent records only
我有一个样本站点 table,其中有 3 个子 table,每个样本站点可以有多个记录。我需要进行左外连接,这样我仍然可以获得所有示例站点,即使它们并非都具有关联的子记录(table 中的一个现在是空的)。根据我对 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();
但是,我意识到如果有多个记录,这不一定是 return 最近的 bacteria/chemistry/macro 记录,因为它不是一对一的关系。所以,我尝试将 .DefaultIfEmpty
替换为
.OrderByDescending(b => b.SAMPLEDATETIME).FirstOrDefault()
,但我收到此错误:
"An expression of type 'BACTERIA_EVW' is not allowed in a subsequent from clause in a query expression with source type 'DbSet'. Type inference failed in the call to 'SelectMany'"
我如何才能正确地 select 只显示最近的记录,同时仍然考虑不存在记录的情况?我认为将其分解为多个 linq 查询会更简单,但如果可能,我宁愿在单个数据库调用中进行。
ETA - 这是使用 SQL 服务器中加载的 ESRI 地理数据库,使用 Entity Framework "code first from database" 模型,(我相信)不允许使用该方法的导航属性.
你快到了。
正在替换
.DefaultIfEmpty()
与
通话
.OrderByDescending(b => b.SAMPLEDATETIME).FirstOrDefault()
很好。但是它把结果类型从sequence变成了single item,所以你还需要把对应的from
关键字换成let
关键字就大功告成了。
我有一个样本站点 table,其中有 3 个子 table,每个样本站点可以有多个记录。我需要进行左外连接,这样我仍然可以获得所有示例站点,即使它们并非都具有关联的子记录(table 中的一个现在是空的)。根据我对 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();
但是,我意识到如果有多个记录,这不一定是 return 最近的 bacteria/chemistry/macro 记录,因为它不是一对一的关系。所以,我尝试将 .DefaultIfEmpty
替换为
.OrderByDescending(b => b.SAMPLEDATETIME).FirstOrDefault()
,但我收到此错误:
"An expression of type 'BACTERIA_EVW' is not allowed in a subsequent from clause in a query expression with source type 'DbSet'. Type inference failed in the call to 'SelectMany'"
我如何才能正确地 select 只显示最近的记录,同时仍然考虑不存在记录的情况?我认为将其分解为多个 linq 查询会更简单,但如果可能,我宁愿在单个数据库调用中进行。
ETA - 这是使用 SQL 服务器中加载的 ESRI 地理数据库,使用 Entity Framework "code first from database" 模型,(我相信)不允许使用该方法的导航属性.
你快到了。
正在替换
.DefaultIfEmpty()
与
通话.OrderByDescending(b => b.SAMPLEDATETIME).FirstOrDefault()
很好。但是它把结果类型从sequence变成了single item,所以你还需要把对应的from
关键字换成let
关键字就大功告成了。