【发布时间】:2020-04-30 18:00:55
【问题描述】:
似乎有很多关于 SQL to LINQ 的问题,但我似乎找不到连接表和分组的示例;特别是需要从多个表中获取数据。
使用这个简单的 SQL:
SELECT
s.showId, s.showName, v.venueName, Min(dateTime) startDate
FROM
shows s
INNER JOIN venues v ON s.venueId = v.venueId
INNER JOIN showDates d ON s.showId = d.showId
GROUP BY
s.showId
我能想到的最好的是以下
var ungrouped = (
from s in db.Shows
join v in db.Venues on s.VenueId equals v.VenueId
join d in db.ShowDates on s.ShowId equals d.ShowId
select new { s, v, d }
).ToList();
var grouped = (
from s in ungrouped
group s by s.s.ShowId into grp
select new
{
showId = grp.Key,
name = (from g in grp select g.s.showName).FirstOrDefault(),
venue = (from g in grp select g.v.VenueName).FirstOrDefault(),
startDate = grp.Max(g => g.d.DateTime)
}
);
这可行,但感觉很乱。我不喜欢:
- 它被分成两个语句
- 不得不反复写
(from g in grp select ...).FirstOrDefault() - 像
s.s.ShowId这样的位 - 它的代码行数比 SQL 多得多
这个例子是一个简单的例子,当我有 5+ 个表要加入和 10+ 个列要选择时,它只会变得更糟。
问题:这是最好的方法吗,我应该接受它;还是有更好的方法来编写这个查询?
【问题讨论】:
-
只是好奇,您想使用 LINQ to SQL 重写它的真正原因是什么?
-
我正在将 PHP 应用程序转换为 .net MVC。数据库以类表示,我知道 Linq 是要走的路——尽管接受建议!
-
第一个建议是使用原始的原始sql,尤其是当您将应用程序迁移到不同的平台时,尽量不要更改与平台无关的代码以避免可能的错误。
-
您要迁移到 .net core 3 吗? Linq GroupBy 的工作方式发生了一些重大变化,您可能需要注意:stackoverflow.com/questions/58138556/…