Linq to SQL:SELECT 个最新的 DISTINCT 条目
Linq to SQL: SELECT latest DISTINCT entries
给定 table 列:[AuditEntityId] [UserName] [CaseID]
我想要具有最高 [AuditEntityId] 的特定 [UserName] 的不同 [CaseID] 列表。
基本上,我想要用户处理的最后五个案例,按从最新到最旧的顺序排列。
我通过 [CaseID] 分组来实现不同:
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
被完全忽略了。最上面的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 中根本没有 ORDER。我可以将 .OrderByDescending
移动到 .GroupBy(a => a.CaseID).Select(a => a.FirstOrDefault())
之后,但是它会在 TOP (1)
被 SELECT
ed 之后排序结果,这不会给我最新的审计条目.
我也尝试使用 MoreLinq 的 .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();
当你在Order By AuditEntityId
之后Group By CaseID
,接着进行其他操作时,那个顺序OrderBy
对结果集没有影响。
编辑
在不知道确切架构的情况下,我无法确定。但是通过"I want a distinct list of [CaseID]'s for a specific [UserName] that has the highest [AuditEntityId]",你可以试试这个
.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();
给定 table 列:[AuditEntityId] [UserName] [CaseID]
我想要具有最高 [AuditEntityId] 的特定 [UserName] 的不同 [CaseID] 列表。
基本上,我想要用户处理的最后五个案例,按从最新到最旧的顺序排列。
我通过 [CaseID] 分组来实现不同:
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
被完全忽略了。最上面的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 中根本没有 ORDER。我可以将 .OrderByDescending
移动到 .GroupBy(a => a.CaseID).Select(a => a.FirstOrDefault())
之后,但是它会在 TOP (1)
被 SELECT
ed 之后排序结果,这不会给我最新的审计条目.
我也尝试使用 MoreLinq 的 .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();
当你在Order By AuditEntityId
之后Group By CaseID
,接着进行其他操作时,那个顺序OrderBy
对结果集没有影响。
编辑
在不知道确切架构的情况下,我无法确定。但是通过"I want a distinct list of [CaseID]'s for a specific [UserName] that has the highest [AuditEntityId]",你可以试试这个
.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();