Для чего-то подобного было бы хорошей идеей создать хранимую процедуру на вашем SQL Server, которая сделает все это за вас (объединяет таблицы, выбирает сообщения пользователя и т. Д.), А затем возвращает только те значения, которые вы необходимо.
Вы можете легко вызвать хранимый процесс из Linq-to-SQL и получить обратно результаты.
Вы не указали точную структуру таблицы, но, вероятно, это будет что-то вроде:
CREATE PROCEDURE dbo.GetUserPoints(@UserName VARCHAR(50))
AS BEGIN
DECLARE @UserID UNIQUEIDENTIIFIER
SELECT @UserID = ID FROM dbo.ASPNET_Users WHERE UserName = @UserName
DECLARE @PostPoints INT
DECLARE @EventPoints INT
DECLARE @CommentPoints INT
SELECT @PostPoints = SUM(ISNULL(Upvotes, 0))
FROM dbo.Posts WHERE UserID = @UserID
SELECT @EventPoints = SUM(ISNULL(Upvotes, 0))
FROM dbo.Events WHERE UserID = @UserID
SELECT @CommentPoints = SUM(ISNULL(Upvotes, 0)) - SUM(ISNULL(Downvotes, 0))
FROM dbo.Comments WHERE UserID = @UserID
-- updated: using RETURN gives you a method on your Linq context that you can
-- easily call like this:
--
-- int myUserPoints = dataContext.GetUserPoints(......)
--
RETURN @PostPoints + @EventPoints + (@CommentPoints / 5)
END
, а затем добавьте эту хранимую процедуру в ваш Linq-to-SQL DataContext, и вы сможете вызывать этот хранимый процесс как метод в контексте данных, что-то вроде этого:
public int GetUserPoints(string userName)
{
return db.GetUserPoints(userName);
}