有人能解释一下如何将这个SQL查询重写为linq表达式吗?我试图实现的是:有一个作业表,其中的行可能处于活动状态,也可能处于非活动状态(是活动bool列),也有批处理表作为历史运行的作业。如果用户在历史表中创建新的作业将没有记录,我应该得到一个空批处理ID,但不是空的jobId在我的应用程序。也很重要,我必须只从批处理表为每个作业的最大值。e批处理表中只有一个ID为1的作业,但存在ID为1、2、3、4的PK。我只需要一个ID为4的行。
select distinct on (b.type_id)
t.id as "JobId", b.id , t.interval_minutes
from types t
left join batches b on t.id = b.type_id
where t.is_active
order by t.id , b.id desc
我不知道如何编写distinct on part。github上有一个issue示例,但我不知道如何将其集成到我的代码中。我的代码:
(from types in Types
join batch in Batches on types.Id equals batch.TypeId into joinBatch
from jBatch in joinBatch.DefaultIfEmpty()
where types.IsActive
orderby types.Id, jBatch.Id descending
select new DTO() {
JobId = types.Id,
ExecTime = types.IntervalMinutes,
BatchId = jBatch.Id,
})
//.GroupBy(b => b.BatchId).Select(g => g.First()) //getting here an exception if batchid is null
.Dump();
public class DTO{
public int JobId {get; set;}
public int ExecTime {get; set;}
public long? BatchId {get; set;}
}
此代码生成:
SELECT p.id AS "JobId", p.interval_minutes AS "ExecTime", b.id AS "BatchId"
FROM types AS p
LEFT JOIN batches AS b ON p.id = b.type_id
WHERE p.is_active
ORDER BY p.id, b.id DESC
GO
型
2条答案
按热度按时间vx6bjr1n1#
那你就能做到。
ldxq2e6h2#
可以使用DistinctBy()方法,该方法用于根据参数消除重复记录。
例如,如果要删除重复记录而不使用参数:
如果你想用特定的原语参数删除重复项
如果要通过传递复杂参数来删除重复项
型
更多信息请访问LINQ's Distinct() on a particular property