Azure WebJobs 和模型以及 SQL 查询

Azure WebJobs and models and SQL queries

我有一个用作 restful API 的 Azure Web 应用程序。这个后端定义了我的系统正在使用的模型:用户、团队、项目、项目。一个User可以加入多个Team,Team-->Project-->Item结构是Grandparent-->Parent-->Child关系

我想为每个用户设置每日更新的电子邮件摘要。我希望它在后台的 Azure Web 作业中 运行,以免给面向客户的 API 服务器增加负担。

在 API 的控制器中编写代码时,我可以像这样编写简单的查询来获取属于某个团队的所有项目(因为模型及其层次关系在 API):

var items = await (from x in db.Items
                  where x.Project.Team.TeamId == teamId
                  select x).ToListAsync();

然而,在网络工作中,我不能那样做——没有模型可言。我看到几个选项:

选项 A) 以某种方式在 Web 作业中使用(或重新创建)模型(和数据库上下文?)。如果这是可能的(而且不是一个糟糕的想法),我想这就是我想要的。

选项 B) 与 Web 作业中的许多冗长 SQL 查询和平相处。我可以向用户 table 查询他们所属的团队。然后,对于每个团队,我可以在项目 table 中查询一组项目。然后,对于每个项目,我可以查询项目 table 以获取每个项目中的项目。

有没有办法制作一个比选项 B 多次调用数据库更有效的神奇 SQL 查询?我试过类似下面的方法,但没有找到可行的方案:

SELECT * FROM Items WHERE Projects WHERE Teams = teamId;

嗯,看来我想要的是 JOIN:What's the difference between INNER JOIN, LEFT JOIN, RIGHT JOIN and FULL JOIN?

我真的只用过 LINQ 从 SQL 数据库中提取数据,现在我知道如何用老式的、更冗长、更不直观的方法来做:)

这是我用来提取属于给定团队的所有项目的代码:

SqlCommand command = new SqlCommand();
command.CommandText = @"SELECT Items.* FROM Items 
                        JOIN Projects
                            ON Projects.ProjectId = Items.ProjectId
                        JOIN Teams
                            ON Teams.TeamId = Projects.TeamId
                    WHERE Teams.TeamId = '" + teamId.ToString() + "'";

我认为最好的方法是选项 C) - 重构您的解决方案并创建单独的项目,其中将包含数据上下文、模型和所有迁移。之后,您可以从您的主应用程序和 WebJob 引用该项目。您还可以将一些与数据库相关的核心功能移动到此项目中,以便从其他项目访问它们。