Вот пример запроса, который я пытаюсь преобразовать в LINQ:
SELECT *
FROM Users
WHERE Users.lastname LIKE '%fra%'
AND Users.Id IN (
SELECT UserId
FROM CompanyRolesToUsers
WHERE CompanyRoleId in (2,3,4) )
Существует отношение FK между CompanyRolesToUsers
и Users
, но это отношение многие ко многим, и CompanyRolesToUsers
является таблицей соединений.
У нас уже есть большая часть нашего сайта, и у нас уже есть большая часть фильтрации, работающей путем построения выражений с использованием класса PredicateExtensions.
Код для простых фильтров выглядит примерно так:
if (!string.IsNullOrEmpty(TextBoxLastName.Text))
{
predicateAnd = predicateAnd.And(c => c.LastName.Contains(
TextBoxLastName.Text.Trim()));
}
e.Result = context.Users.Where(predicateAnd);
Я пытаюсь добавить предикат для подвыбора в другой таблице. (CompanyRolesToUsers
)
То, что я хотел бы добавить, это то, что делает это:
int[] selectedRoles = GetSelectedRoles();
if( selectedRoles.Length > 0 )
{
//somehow only select the userid from here ???:
var subquery = from u in CompanyRolesToUsers
where u.RoleID in selectedRoles
select u.UserId;
//somehow transform this into an Expression ???:
var subExpression = Expression.Invoke(subquery);
//and add it on to the existing expressions ???:
predicateAnd = predicateAnd.And(subExpression);
}
Есть ли способ сделать это? Это расстраивает, потому что я могу легко написать хранимую процедуру, но я новичок в этом вопросе LINQ и у меня есть крайний срок. Мне не удалось найти подходящий пример, но я уверен, что он где-то есть.