Azure WebJobs和模型以及SQL查询

时间:2016-06-05 21:21:56

标签: sql asp.net linq azure azure-webjobs

我有一个Azure网络应用程序作为一个宁静的API。该后端定义了我的系统使用的模型:用户,团队,项目,项目。用户可以加入许多团队,团队 - >项目 - >项目结构是祖父母 - >父母 - >儿童关系。

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

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

@Query("SELECT m1.spendpoolId FROM ContentDetails m1 join ( "
        + "select spendpoolId, MAX(uploadedDate) latest from ContentDetails "
        + "group by spendpoolId) m2 "
        + "on m1.uploadedDate = latest and m2.spendpoolId= m1.spendpoolId "
        + "where m1.spendpoolId IN (:spendpoolIds) "
        + " group by m1.spendpoolId "
        + "order by m1.uploadedDate desc ) ")
List<Spendpool> findSortedSpendpoolIds(@Param("spendpoolIds") List<Long> spendpoolIds);

然而,在网络工作中,我无法做到这一点 - 没有模型可言。我看到了几个选项:

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

选项B)在Web作业中使用许多冗长的SQL查询来实现和平。我可以在User表中查询他们所属的团队。然后,对于每个团队,我可以在Project表中查询一组Projects。然后,对于每个项目,我可以在Items表中查询每个项目中的Items。

有没有办法让一个神奇的SQL查询比Option B对数据库的多次调用更有效?我已经尝试过类似下面的内容,但没有找到合适的方案:

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

2 个答案:

答案 0 :(得分:1)

从我的角度来看,最佳方式是Opition C) - 重构您的解决方案并创建包含数据上下文,模型和所有迁移的单独项目。之后,您可以从主应用程序和WebJob引用此项目。您还可以将一些与核心数据库相关的函数移动到此项目中,以使其可以从其他项目访问。

答案 1 :(得分:0)

好吧,看起来我想要的是一个加入: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() + "'";