public override IEnumerable<Tuple<Feed, object>> GetFeeds(FeedFilter filter) { var q1 = new SqlQuery("projects_messages d") .Select(DiscussionColumns().Select(d => "d." + d).ToArray()) .Select(ProjectColumns().Select(p => "p." + p).ToArray()) .Select(CommentColumns().Select(c => "c." + c).ToArray()) .InnerJoin("projects_projects p", Exp.EqColumns("p.id", "d.project_id") & Exp.Eq("p.tenant_id", filter.Tenant)) .LeftOuterJoin("projects_comments c", Exp.EqColumns("c.target_uniq_id", "concat('Message_', d.id)") & Exp.Eq("c.tenant_id", filter.Tenant) & Exp.Eq("c.inactive", 0)) .Where("d.tenant_id", filter.Tenant) .Where(Exp.Between("d.create_on", filter.Time.From, filter.Time.To)); var q2 = new SqlQuery("projects_messages d") .Select(DiscussionColumns().Select(d => "d." + d).ToArray()) .Select(ProjectColumns().Select(p => "p." + p).ToArray()) .Select(CommentColumns().Select(c => "c." + c).ToArray()) .InnerJoin("projects_projects p", Exp.EqColumns("p.id", "d.project_id") & Exp.Eq("p.tenant_id", filter.Tenant)) .LeftOuterJoin("projects_comments c", Exp.EqColumns("c.target_uniq_id", "concat('Message_', d.id)") & Exp.Eq("c.tenant_id", filter.Tenant) & Exp.Eq("c.inactive", 0)) .Where("d.tenant_id", filter.Tenant) .Where(Exp.Between("c.create_on", filter.Time.From, filter.Time.To)); using (var db = new DbManager(DbId)) { var comments = db.ExecuteList(q1.Union(q2)).ConvertAll(ToComment); var groupedDiscussions = comments.GroupBy(c => c.Discussion.ID); return groupedDiscussions .Select(d => new Tuple<Message, IEnumerable<ProjectComment>>(d.First().Discussion, d)) .Select(ToFeed); } }