需要将sql语句转换为Entity Framework等效

时间:2013-04-27 04:13:19

标签: sql-server entity-framework-5

鉴于以下表格:

InstrumentLogs

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)

我需要弄清楚如何使用Entity Framework编写这个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并不喜欢这样。我最后得出的错误是只支持原始类型或枚举类型。

感谢您的帮助。

1 个答案:

答案 0 :(得分: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() });