Более прямой перевод вашего исходного SQL-запроса будет выглядеть так:
var q =
// Join tables TblDesign with TblDesigner and filter them
from d in db.TblDesigner
join s in db.TblDesign on d.ID equals s.DesignerID
where s.Completed && d.Active
// Key and values used for grouping (note, you don't really need the
// value here, because you only need Count of the values in a group, but
// in case you needed anything from 's' or 'd' in 'select', you'd write this
let value = new { s, d }
let key = new { d.ID, d.FirstName, d.LastName }
group value by key into g
// Now, filter the created groups (return only non-empty) and select
// information for every group
where g.Count() > 0
select { ID = g.Key.ID, FirstName = g.Key.FirstName,
LastName = g.Key.LastName, Count = g.Count() };
Предложение HAVING
переводится в обычный where
, который применяется после группировки значений с использованием group ... by
. Результатом группировки является коллекция групп (другие коллекции), поэтому вы можете использовать where
для фильтрации групп. В предложении select
вы можете затем вернуть информацию из ключа (используется для группировки) и совокупности значений (используя g.Count()
)
EDIT : Как указывает mmcteam (см. Комментарии), предложение where g.Count() > 0
не является обязательным, поскольку оно уже гарантировано join
. Я оставлю это там, потому что он показывает, как переводить предложение HAVING
в целом, так что это может быть полезно в других случаях.