如何解决linq 伪代码中的 SQL 查询
我只需要输出表中的最后一条记录,但只输出组中的那些用户。我只能显示那些在组中的人。但是我拿不到最后的记录。 我写了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 的方式实现。
快速修复
如果您添加 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 会导致多次调用数据库。您可以将其重写为单个查询,如下所示:
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);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。