gpt4 book ai didi

c# - 使用多个表和组将 SQL 转换为 LINQ

转载 作者:行者123 更新时间:2023-12-04 10:07:07 25 4
gpt4 key购买 nike

似乎有很多关于 SQL 到 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 个以上的列要选择时,它只会变得更糟。

    问题:这是最好的方法吗,我应该接受它;或者有没有更好的方法来编写这个查询?

    最佳答案

    我不确定您是否正在寻找这样的东西,但它更简洁一些,它没有分成 2 个语句,您可能会发现它有帮助。我无法使用 dbcontext,所以我使用列表来确保语法正确。

    var res = Shows.Join(Venues,
    show => show.VenueID,
    venue => venue.VenueID,
    (show, venue) => new { show, venue })
    .Join(ShowDates,
    val => val.show.ShowID,
    showdate => showdate.ShowID,
    (val, showDate) => new { val.show, val.venue, showDates = showDate })
    .GroupBy(u => u.show.ShowID)
    .Select(grp => new
    {
    showId = grp.Key,
    name = grp.FirstOrDefault()?.show.showName,
    venue = grp.FirstOrDefault()?.venue.VenueName,
    startDate = grp.Max(g => g.showDates.DateTime)
    });

    关于c# - 使用多个表和组将 SQL 转换为 LINQ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61529849/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com