Не уверен, как ссылка на SQL будет вписываться в это, но если это возможно, вы можете попробовать использовать функцию DENSE_RANK. Например, приведенный ниже запрос вернет последние 3 проекта для каждого пользователя. Ограничение является общим для всех пользователей, но ничто не мешает ссылаться на таблицу с ограничениями.
declare @numberOfProjects int
set @numberOfProjects = 3
;with topNProjects(userid, projectid, createdtutc, dense_rank)
as (
select p.userid, P.ProjectId, p.CreatedDtUtc, DENSE_RANK() OVER (PARTITION BY P.UserId ORDER BY P.ProjectId) AS DENSE_RANK
from DS_Project P
)
select userid, projectid, createdtutc from topNProjects
where dense_rank <= @numberOfProjects
order by projectid desc
EDITED: попробовал решение LINQed и придумал следующее. Я думаю, все, что вам нужно сделать, это заменить мои коллекции ссылками на таблицы в контексте данных.
Dictionary<int, string> userProjects = new Dictionary<int, string>
{
{ 1, "User1" },
{ 2, "User1" },
{ 3, "User2" },
{ 4, "User3" },
{ 5, "User1" },
{ 6, "User2" },
{ 7, "User2" },
{ 8, "User1" },
};
Dictionary<string, int> limits = new Dictionary<string, int>
{
{ "User1", 3 },
{ "User2", 2 },
{ "User3", 2 },
};
var ranked =
from up in userProjects
join l in limits on up.Value equals l.Key
orderby up.Value
where (from upr in userProjects
where upr.Value == up.Value && upr.Key <= up.Key
select upr).Count() <= l.Value
select up;
Результат выглядит следующим образом: кажется, это то, что вы ищете:
1, User1
2, User1
5, User1
3, User2
6, User2
4, User3