【问题标题】:SQL query in linq pseudocodelinq 伪代码中的 SQL 查询
【发布时间】:2021-07-12 14:07:18
【问题描述】:

我只需要输出表中的最后一条记录,但只需要输出组中的那些用户。我只能显示那些在组中的人。但我无法获得最后的记录。 我写了2个请求,第一个给出错误,第二个输出所有记录...

foreach (var item1 in brigades.Persons)
            {
                var persontrack =
                from s in new DataContext().GetTable<PersonTrack>()
                join t in a on s.PersonId equals t.Id
                where t.Id == item1.Id
                group s by s.Id into grp
                from last in (from custRec in grp where custRec.Id == grp.Max(cr => cr.Id) select custRec)
                select last;
                ps.AddRange(persontrack);
            }

foreach (var item in brigades.Persons)
        {
            var persontrack = from s in new DataContext().GetTable<PersonTrack>()
                              join t in brigades.Persons on s.PersonId equals t.Id
                              where t.Id == item.Id
                              orderby s.Id
                              descending
                              select s;
            ps.AddRange(persontrack);
        }

【问题讨论】:

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


    【解决方案1】:

    据我所知,这只能通过 C# 编写 linq 的方式实现。

    快速修复

    如果您添加 FirstOrDefault,您的第二个查询将会成功(查询被翻译到 sql,即使这样写,也只返回最后一个元素)。

    using (var db = new DataContext())    // create once to gain performance
    {
        foreach (var item in brigades.Persons)
        {
            var persontrack = (from s in db.GetTable<PersonTrack>()
                               join t in brigades.Persons on s.PersonId equals t.Id
                               where t.Id == item.Id
                               orderby s.Id
                               descending
                               select s).FirstOrDefault();
            if (persontrack != null)
                ps.Add(persontrack);
        }
    }   // DataContext is disposed here
    

    或者这也可以,但是添加空值会很奇怪:

    ps.Add(persontrack.FirstOrDefault());
    

    另类

    但是,使用 foreach 会导致多次调用 db。您可以将其重写为单个查询,如下所示:

    using (var db = new DataContext())
    {
        var eachLastTrack = from s in db.GetTable<PersonTrack>()
                            join t in brigades.Persons on s.PersonId equals t.Id
                            // group by PersonId instead, to avoid foreach!
                            group s by s.PersonId into grp 
                            select grp.OrderByDescending(s => s.Id).FirstOrDefault();
                            // note: FirstOrDefault() applied for each "t.Id"!
        ps.AddRange(eachLastTrack);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-06
      • 2018-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多