【问题标题】:What SQL query or LINQ code would get the following data?什么 SQL 查询或 LINQ 代码会得到以下数据?
【发布时间】:2009-03-27 18:36:17
【问题描述】:

首先,这是我的数据库架构相关部分的图片:

Database Schema http://ewal.net/stuff/schema.png

我有几个越来越复杂的概念查询。目前,我正在使用一系列 SQL 查询(即从 C# 代码到 SQL Server 的多次往返行程)来执行这些操作,并且我想找到一种方法在单个查询中获取这些查询,但是这样做有点超出我个人的 TSQL/LINQ 能力。以下是我试图弄清楚如何编写的查询:

  1. 为每个用户返回最新工作计划记录的查询(不是针对特定用户,而是针对所有用户)。
  2. 返回一组指定用户的最新工作计划的查询(即我在客户端上有一个用户 ID 列表(即在一个数组中)
  3. 用于检索每个指定用户集的所有“当前”项目记录的查询。 “当前”是指项目附加到的工作计划记录是关联用户的最新工作计划记录。

作为参考,我在 C# 中使用 SQL Server 2005 和 LINQ to SQL,并且很乐意找到基于存储过程的解决方案或完成每个查询的直接 LINQ 代码。

【问题讨论】:

标签: c# sql linq linq-to-sql


【解决方案1】:

所有用户的最新工作计划:

SELECT
     WP1.*
FROM
     Workplans WP1
LEFT OUTER JOIN dbo.Workplans WP2 ON
     WP2.UserID = WP1.UserID AND
     WP2.Date > WP1.Date
WHERE
     WP2.WorkplanID IS NULL

对于给定的一组用户,编写一个表值函数,将分隔的 ID 列表转换为这些 ID 的表。如果您四处搜索,我知道我之前已经在此处发布了该代码。然后你可以使用:

SELECT
     WP1.*
FROM
     dbo.GetTableFromIDList(@id_list) U
INNER JOIN Workplans WP1 ON
     WP1.UserID = U.ID
LEFT OUTER JOIN dbo.Workplans WP2 ON
     WP2.UserID = WP1.UserID AND
     WP2.Date > WP1.Date
WHERE
     WP2.WorkplanID IS NULL

对于给定的一组用户,返回他们当前的所有项目:

SELECT
     P.*
FROM
     dbo.GetTableFromIDList(@id_list) U
INNER JOIN Workplans WP1 ON
     WP1.UserID = U.ID
LEFT OUTER JOIN dbo.Workplans WP2 ON
     WP2.UserID = WP1.UserID AND
     WP2.Date > WP1.Date
INNER JOIN dbo.Projects P ON
     P.WorkplanID = WP1.WorkplanID
WHERE
     WP2.WorkplanID IS NULL

当然,您实际上应该列出列名,而不是使用“*”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多