我有一个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();
答案 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() + "'";