C# Linq到SQL:选择最新的不同条目
给定一个列为:[AuditEntityId][UserName][CaseID]的表 我想要一个具有最高[AuditEntityId]的特定[UserName]的[CaseID]的独特列表 基本上,我想要用户处理的最后五个案例,按从最新到最旧的顺序排列 我通过在[CaseID]上分组来实现distinct:C# Linq到SQL:选择最新的不同条目,c#,sql-server,linq,linq-to-sql,distinct,C#,Sql Server,Linq,Linq To Sql,Distinct,给定一个列为:[AuditEntityId][UserName][CaseID]的表 我想要一个具有最高[AuditEntityId]的特定[UserName]的[CaseID]的独特列表 基本上,我想要用户处理的最后五个案例,按从最新到最旧的顺序排列 我通过在[CaseID]上分组来实现distinct: var lastItems = baseController.db.AuditEntities .OrderByDescen
var lastItems = baseController.db.AuditEntities
.OrderByDescending(a => a.AuditEntityId)
.GroupBy(a => a.CaseID)
.Select(a => a.FirstOrDefault())
.Where(a => a.CaseID != null && a.CaseID != 0)
.Where(a => a.UserName == filterContext.HttpContext.User.Identity.Name)
.Take(5)
.ToList();
这样做的目的是为我提供一个用户处理过的案例的清晰列表,但是完全忽略了.OrderByDescending
。top linq语句转换为以下SQL:
SELECT TOP (5)
[Limit1].[AuditEntityId] AS [AuditEntityId],
[Limit1].[Reference] AS [Reference],
[Limit1].[Timestamp] AS [Timestamp],
[Limit1].[EntityName] AS [EntityName],
[Limit1].[UserName] AS [UserName],
[Limit1].[Action] AS [Action],
[Limit1].[ComplaintId] AS [ComplaintId],
[Limit1].[CaseID] AS [CaseID],
[Limit1].[AuditReferencingStart] AS [AuditReferencingStart],
[Limit1].[AuditReferencingEnd] AS [AuditReferencingEnd]
FROM
(SELECT DISTINCT
[Extent1].[CaseID] AS [CaseID]
FROM
[dbo].[AuditEntity] AS [Extent1] ) AS [Distinct1]
CROSS APPLY (SELECT TOP (1)
[Extent2].[AuditEntityId] AS [AuditEntityId],
[Extent2].[Reference] AS [Reference],
[Extent2].[Timestamp] AS [Timestamp],
[Extent2].[EntityName] AS [EntityName],
[Extent2].[UserName] AS [UserName],
[Extent2].[Action] AS [Action],
[Extent2].[ComplaintId] AS [ComplaintId],
[Extent2].[CaseID] AS [CaseID],
[Extent2].[AuditReferencingStart] AS [AuditReferencingStart],
[Extent2].[AuditReferencingEnd] AS [AuditReferencingEnd]
FROM
[dbo].[AuditEntity] AS [Extent2]
WHERE
([Distinct1].[CaseID] = [Extent2].[CaseID]) OR (([Distinct1].[CaseID] IS NULL) AND ([Extent2].[CaseID] IS NULL)) ) AS [Limit1]
WHERE
([Limit1].[CaseID] IS NOT NULL) AND ( NOT ((0 = [Limit1].[CaseID]) AND ([Limit1].[CaseID] IS NOT NULL))) AND (([Limit1].[UserName] = @p__linq__0))
提供的SQL中根本没有顺序。我可以将.OrderByDescending
移动到.GroupBy(a=>a.CaseID)之后。选择(a=>a.FirstOrDefault())
,但它会在顶部(1)
被选择后对结果排序,这不会给我最新的审核条目
我还尝试使用的.DistinctBy
,但使用此.OrderByDescending
仍然无法按预期工作:
var lastItems = baseController.db.AuditEntities
.Where(a => a.CaseID != null && a.CaseID != 0 && a.UserName == filterContext.HttpContext.User.Identity.Name)
.DistinctBy(a => a.CaseID)
.OrderBy(a => a.AuditEntityId)
.Take(5)
.ToList();
您需要对结果集进行排序。试一试
var lastItems = baseController.db.AuditEntities
.GroupBy(a => a.CaseID)
.Select(a => a.FirstOrDefault())
.Where(a => a.CaseID != null && a.CaseID != 0)
.Where(a => a.UserName == filterContext.HttpContext.User.Identity.Name)
.OrderByDescending(a => a.AuditEntityId)
.Take(5)
.ToList();
当您在按审核实体ID排序后按案例ID进行分组,然后执行其他操作时,该排序不会对结果集产生影响
编辑
如果不知道确切的模式,我无法确定。但是通过“我想要一个具有最高[AuditEntityId]的特定[UserName]的[CaseID]的不同列表”,您可以尝试以下方法
.db.AuditEntities
.Where(a => a.CaseID != null
&& a.CaseID != 0
&& a.UserName == filterContext.HttpContext.User.Identity.Name)
.GroupBy(a => a.CaseID)
.OrderByDescending(grp => grp.Max(g => g.AuditEntityId))
.Take(5)
.Select(a => a.FirstOrDefault())
.ToList();
您需要对结果集进行排序。试一试
var lastItems = baseController.db.AuditEntities
.GroupBy(a => a.CaseID)
.Select(a => a.FirstOrDefault())
.Where(a => a.CaseID != null && a.CaseID != 0)
.Where(a => a.UserName == filterContext.HttpContext.User.Identity.Name)
.OrderByDescending(a => a.AuditEntityId)
.Take(5)
.ToList();
当您在按审核实体ID排序后按案例ID进行分组,然后执行其他操作时,该排序不会对结果集产生影响
编辑
如果不知道确切的模式,我无法确定。但是通过“我想要一个具有最高[AuditEntityId]的特定[UserName]的[CaseID]的不同列表”,您可以尝试以下方法
.db.AuditEntities
.Where(a => a.CaseID != null
&& a.CaseID != 0
&& a.UserName == filterContext.HttpContext.User.Identity.Name)
.GroupBy(a => a.CaseID)
.OrderByDescending(grp => grp.Max(g => g.AuditEntityId))
.Take(5)
.Select(a => a.FirstOrDefault())
.ToList();
但是,如果在分组后IOrderBy
,它是在之后排序的。Select(a=>a.FirstOrDefault())
这意味着最新条目不是“first”条目selected如果在分组后IOrderBy
,它是在之后排序的。Select(a=>a.FirstOrDefault())
这意味着最近的条目不是“第一个”选择的条目