Сначала попытайтесь избавиться от вставки значений параметров с помощью string.Format
в запросы SQL.Это огромная проблема безопасности.
К вашему запросу.Я должен признать, я немного потерян в вашей конкатенации строк :-P, но если я прав, вы хотите получить События и некоторую информацию о пользователе.Насколько я вижу, SenderId и ReciverId уже ваши идентификаторы.Если это так, вы можете полностью удалить первый SELECT и предоставить id (в качестве параметра) непосредственно во второй оператор SQL следующим образом (только SQL):
Редактировать: Том показал мне недостающую часть (Status = Ok)
SELECT TOP (20) a. *, B.UserName в качестве отправителя, c.UserName в качестве получателя, b.Avatar в качестве SenderPic FROM Events a INNER JOIN Usersb ON a.SenderId = b.Id INNER JOIN Пользователи c ON a.ReceiverId = c.Id ГДЕ a.SenderId = @id ИЛИ a.ReceiverId = @id; Исправленная версия:
; WITH OkUsers AS (
SELECT
u.*
FROM Users u
JOIN Friends f ON u.Id = f.SenderId OR u.Id = f.RecipientId
WHERE
f.Status = 'Ok'
)
SELECT TOP(20)
a.*
,b.UserName as Sender
,c.UserName as Receiver
,b.Avatar as SenderPic
FROM Events a
INNER JOIN OkUsers b ON a.SenderId = b.Id
INNER JOIN OkUsers c ON a.ReceiverId = c.Id
WHERE
a.SenderId = @id
OR a.ReceiverId = @id;