【发布时间】:2019-06-02 15:53:29
【问题描述】:
一段时间以来,我一直在尝试将此 SQL 转换为 linq:
SELECT
Name
FROM
Director d
JOIN
Movie m ON d.Id = m.DirectorId
JOIN
MovieActor ma ON m.Id = ma.MovieId
WHERE
ReleaseDate <= '2005-12-31'
AND Rating >= 9
GROUP BY
Name
HAVING
COUNT(DISTINCT ma.ActorId) BETWEEN 3 AND 7
AND COUNT(DISTINCT CASE WHEN m.DurationMinutes >= 60 THEN m.DurationMinutes END) >= 2
;
这里是 100% 的工作部分,这很简单。
var query4 = (from d in directors
join m in movies on d.Id equals m.DirectorId
join ma in movieActors on m.Id equals ma.MovieId
where m.ReleaseDate <= Convert.ToDateTime("2015-12-31")
where m.Rating >= 9
);
主要是我在这些问题上苦苦挣扎:
- 将
d, m, ma称为单个表而不是3 个以某种方式连接的表,因为当我尝试group d by ... into g时,我失去了另外两个表。 - 我无法理解如何计算一个参数(进行条件检查)而不丢失其他参数。
另外HAVING linq 中的语法并不明显。
编辑: 我正在使用 LINQ to Objects 提供程序,这里有一些: 按初始化的类,它们是基本的字段容器
public Director(int _Id, string _Name)
public Movie(int _Id, string _Name, int _DurationMinutes, DateTime _ReleaseDate, int _DirectorId, int _Rating)
public Actor(int _Id, string _Name, int _Age)
public MovieActor(int _MovieId, int _ActorId)
以及我用于测试的数据(从这些数组中收集列表)
var directorArr = new (int, string)[] { (1, "Bebopvsky"), (2, "Tarrantino"), (3, "CubeRick") };
var actorArr = new (int, string, int)[]
{ (1, "Dat Maan",75), (2, "That Man", 28),
(3, "Dat Women", 32), (4, "That Women", 22),
(5, "Already Women", 12) };
var moviesArr = new (int, string, int, DateTime, int, int)[]
{ (1, "Platform for soul", 121, Convert.ToDateTime("2018-12-31"), 2, 9),
(2, "Full-featured access management", 42, Convert.ToDateTime("2019-01-01"), 3, 7),
(3, "Robust LDAP server for Java", 13, Convert.ToDateTime("2005-05-25"), 3, 4),
(4, "Man of Rain", 114, Convert.ToDateTime("2004-07-21"), 1, 10),
(5, "Man of Arms", 152, Convert.ToDateTime("2003-02-17"), 1, 9),
(6, "Man of War", 93, Convert.ToDateTime("2017-07-05"), 2, 8),
(7, "Man of Legs", 33, Convert.ToDateTime("2018-11-11"), 1, 9),
(8, "Mof", 55, Convert.ToDateTime("2015-11-11"), 2, 8) };
var movieActorArr = new (int, int)[]
{ (1,1), (1,3), (1,4), (1,5),
(2,1), (2,5),
(3,4),
(4,1), (4,2), (4,3), (4,4),
(5,1), (5,2), (5,3), (5,4), (5,5),
(6,1), (6,2), (6,3),
(7,2), (7,4), (7,5),
(8,1), (8,4) };
【问题讨论】:
-
所以你想要导演的名字,他们导演了 3 到 7 名演员,并且有两部电影或更多电影超过 60 分钟?
-
您使用的是什么 LINQ 提供程序? LINQ 到对象? LINQ To Entity Framework(如果是,那是什么版本的 EF)?您能否发布您的 C# 模型以便我们更轻松地进行复制?
-
@Hogan 导演,导演了 2 部或更多 60 分钟以上的电影,每部有 3 到 7 名演员参与。现在我想,我的 SQL 查询也需要一些更改。
-
@42ama 是的,你的 SQL 错了。