0

给定下表:

仪器日志

InstrumentLogId (PK, int, not null)
InstrumentId (FK, int, not null)
LogDate (datetime, not null)
Action (string, not null)

仪器

InstrumentId (PK, int, not null)
CountyId (FK, int, not null)

CountyId (PK, int, not null)
StateFips (FK, int, not null)
Name (string, not null)

状态

StateFips (PK, int, not null)
Name (string, not null)

我需要弄清楚如何使用实体框架编写这个 SQL 查询:

select s.StateName, count(*) as total
from instruments as i 
join counties as c on i.CountyID = c.CountyID
join states as s on s.StateFIPS = c.StateFIPS
where i.InstrumentID in 
   (select i1.InstrumentId from InstrumentLogs as i1 where i1.action = 'review' and
    i1.logdate in (select max(logdate) from instrumentlogs as i2 where i1.instrumentid 
    =i2.InstrumentID group by i2.instrumentid))
group by s.StateName

我尝试了一些类似的东西:

_context.Instruments.Include(i => i.County.State)
  .Where(i => _context.Logs.Where(l => l.Action == 'review' 
     && _context.Logs.Where(l2 => l2.InstrumentId == l.InstrumentId).Max(l2 => l2.LogDate) == l.LogDate).GroupBy(i => i.County.State.Name)
  .Select(g => new { State = g.Key.Name, Total = g.Count() });

但是,EF 不喜欢这样。我以错误告终,指出仅支持原始类型或枚举类型。

谢谢你的帮助。

4

1 回答 1

0

我终于让它像这样工作了

        var _query = _dataContext.IndexLogs.GroupBy(l => l.InstrumentId, l => l)
            .Select(grp => new { Id = grp.Key, Date = grp.Max(g => g.ActionDate) });

        //Prequery to find log records that match given type and action type
        var _indexes = _dataContext.IndexLogs.Where(l => l.Action == type 
            && _query.Contains(new { Id = l.InstrumentId, Date = l.ActionDate})).Select(i => i.InstrumentId);


        var _states = _dataContext.AdvancedIndexes
            .Include(i => i.County.State)
            .Where(a => a.Id > 0 && _indexes.Contains(a.Id))
            .GroupBy(i => new { i.County.State.Id, i.County.State.Name })
            .Select(g => new { fips = g.Key.Id, name = g.Key.Name, count = g.Count() });
于 2013-05-04T20:01:18.730 回答