在Linq To Sql或Sql中执行困难的查询
这件事我已经做了两天了,我想不出来。我希望比我聪明的人能试试 假设我有以下表格:在Linq To Sql或Sql中执行困难的查询,sql,linq-to-sql,Sql,Linq To Sql,这件事我已经做了两天了,我想不出来。我希望比我聪明的人能试试 假设我有以下表格: Rating: Id | Name 1 | A 2 | B 3 | C 4 | D 5 | E Inspection: Id | Date (mm/dd/yyyy) 1 | 01/04/2012 2 | 04/04/2012 3 | 28/03/2012 4 | 04/04/2012 Observation: Id | InspectionId
Rating:
Id | Name
1 | A
2 | B
3 | C
4 | D
5 | E
Inspection:
Id | Date (mm/dd/yyyy)
1 | 01/04/2012
2 | 04/04/2012
3 | 28/03/2012
4 | 04/04/2012
Observation:
Id | InspectionId | RatingId
1 | 2 | 3
2 | 1 | 2
3 | 4 | 3
4 | 2 | 1
5 | 3 | 3
6 | 1 | 2
我希望查询返回:
RatingName | Date(mm/dd/yyyy) | ObservationCount
A | 01/04/2012 | 0
B | 01/04/2012 | 1
C | 01/04/2012 | 1
D | 01/04/2012 | 0
E | 01/04/2012 | 0
A | 04/04/2012 | 1
B | 04/04/2012 | 0
C | 04/04/2012 | 2
D | 04/04/2012 | 0
E | 04/04/2012 | 0
A | 28/03/2012 | 0
B | 28/03/2012 | 0
C | 28/03/2012 | 1
D | 28/03/2012 | 0
E | 28/03/2012 | 0
所以我需要每个日期每个评级的观察次数。是的,我需要有返回0个观测值的记录,因为我在堆叠图表中使用这些数据,如果没有它们,它会抛出一个错误。我已经成功地获得了上面的表,但是没有使用下面的Linq to Sql查询返回0个观察值的记录,但是从这一点上,我陷入了困境
MyDataContext DB = new MyDataContext();
var data =
(from r in DB.Ratings
join o in DB.Observations on r.Id equals o.RatingId into ro
from observation in ro.DefaultIfEmpty()
join i in DB.Inspections on observation.InspectionId equals i.Id into roi
from q in roi.DefaultIfEmpty()
group q by new { Name = r.Name, Date = q.Date } into grouped
select
new
{
RatingName = grouped.Key.Name,
Date = grouped.Key.Date,
ObservationCount = grouped.Count(x => x != null)
}).OrderBy(x => x.Date);
我希望您能用LINQtoSQL或简单的旧Sql来回答我,谢谢 您应该在两个参考表上尝试
交叉连接
,然后外部连接
返回到“数据”表-然后检查观察值
是否为空。。。然后分组求和
SELECT
[Name],
[Date],
SUM([Exists])
FROM
(
SELECT
name,
[Date],
CASE WHEN o.Id IS NULL THEN 0
ELSE 1
END as [Exists]
FROM
Rating r CROSS JOIN
Inspection i
LEFT OUTER JOIN Observation o
ON o.RatingId = r.Id AND o.InspectionId = i.Id
) as [source]
GROUP BY [Name], [Date]
ORDER BY
[Date],
name
转换为LINQ将是一个类似的两步过程-在分组和求和之前获取内部结果集(检查观察值是否为空)。我要感谢您帮助我实现这一点,有时您只需要一双新眼睛:)