C# 从多条记录中获取最后一条记录并将结果保存在LINQ列表中
我有一个表'StatusC# 从多条记录中获取最后一条记录并将结果保存在LINQ列表中,c#,sql,wpf,linq,C#,Sql,Wpf,Linq,我有一个表'Status,它有多个状态User。我只想读取每个用户的最后一个状态。我如何在Lambda Linq to SQL中实现这一点 -------Status------------- | user1, Stats_Active | | user1, Stats_InActive | | user1, Stats_Deleted | | user2, Stats_Login | | user2, Stats_Logout | | user2, St
,它有多个状态
User。我只想读取每个
用户的最后一个状态。我如何在Lambda Linq to SQL中实现这一点
-------Status-------------
| user1, Stats_Active |
| user1, Stats_InActive |
| user1, Stats_Deleted |
| user2, Stats_Login |
| user2, Stats_Logout |
| user2, Stats_Edited |
________________________
我希望获得以下输出:
User1, Status_Delete
User2,Status_edited
这是我的Linq到SQL查询:
EntityName db = new EntityName();
var result = db.Status.OrderByDescending(k=> k.DateTime).List()
这只是按降序返回整个列表。我怎样才能达到我想要的输出?我想你需要这样的东西:
var result = db.Status
.AsEnumerable()
.GroupBy(s=>s.UserId)
.Select(gr=>
{
// Generally you should avoid use the First
// and you should use the FirstOrDefault
// but in this context is safe to use First.
var mostRecentComplaint = gr.OrderByDescending(k=> k.DateTime)
.First();
return new Complaint_DTO
{
ComplaintId = gr.Key,
Status = mostRecentComplaint.Status,
CreatedDate = mostRecentComplaint.CreatedDate
};
}).ToList();
- 首先,我们根据UserId对项目进行分组。因此,所有具有相同用户ID的记录都将进入同一组
- 然后对每个组的结果按日期时间降序排序,得到每个组的第一项,我们得到了预期的结果李>
UserId
分组,然后按DateTime
属性对组进行排序:
var result =(from s in db.Status
group s by s.UserId into g
let first=g.OrderByDescending(s=>s.DateTime).FirstOrDefault()
select new { userId= g.Key, Status= first.Status, CreatedDate=first.CreatedDate}).ToList();
更新
我使用测试了我的查询,并将其转换为以下lambda表达式:
Status
.GroupBy (a => a.UserId)
.Select (
g =>
new
{
g = g,
first = g.OrderBy (a => a.DateTime).FirstOrDefault ()
}
)
.Select (
temp0 =>
new
{
Key = temp0.g.Key,
Status= temp0.first.Status,
CreatedDate=temp0.first.CreatedDate
}
)
在该SQL查询的末尾转换为:
SELECT [t1].[UserId] AS [UserId], (
SELECT [t3].[Status], [t3].[DateTime]
FROM (
SELECT TOP (1) [t2].[Status]
FROM [Status] AS [t2]
WHERE (([t1].[UserId] IS NULL) AND ([t2].[UserId] IS NULL)) OR (([t1].[UserId] IS NOT NULL) AND ([t2].[UserId] IS NOT NULL) AND ([t1].[UserId] = [t2].[UserId]))
ORDER BY [t2].[DateTime]
) AS [t3]
) AS [Status],(
SELECT [t5].[DateTime]
FROM (
SELECT TOP (1) [t4].[DateTime]
FROM [Application] AS [t4]
WHERE (([t1].[UserId] IS NULL) AND ([t4].[UserId] IS NULL)) OR (([t1].[UserId] IS NOT NULL) AND ([t4].[UserId] IS NOT NULL) AND ([t1].[UserId] = [t4].[UserId]))
ORDER BY [t4].[DateTime]
) AS [t5]
) AS [DateTime]
FROM (
SELECT [t0].[UserId]
FROM [Application] AS [t0]
GROUP BY [t0].[UserId]
) AS [t1]
如果没有datetime列,您可以按照此模式按降序排列ID(如果您有一个自动编号的标识列),如果我不想使用
var
?那么,您需要创建一个自定义类来保存结果。我建议您在internet上搜索什么是DTO。当我尝试使用我的类的列表时,会出现错误无法将类型“System.Collections.Generic.List”隐式转换为“System.Collections.Generic.List”
,然后在Select子句中使用User\u DTO类。我会更新我的帖子,如果你有任何问题,请告诉我。我确实使用了User\u DTO
类,但问题是当我使用var
时,它工作正常,但是如果我使用List
它会给我这个错误如果你使用User\u DTO
,那么查询结果将是List
。如果我是列表
,我无法理解你所说的意思。你想在哪里使用它?你是否做了上述更改,.Select(gr=>newuser\u DTO{…}
它仍然返回一个i分组列表
?一个i分组序列
由GroupBy
返回。然后使用Select
创建另一个序列,一个User\u DTO
对象序列,最后但并非最不重要的是在创建列表时调用ToList
我对这个序列很感兴趣。