C# Linq,将一个列表连接到另一个列表中的最后一项
我有一个用户列表和另一个用户活动列表。 我想获得包括用户上次活动在内的用户列表。 我试过这个:C# Linq,将一个列表连接到另一个列表中的最后一项,c#,linq,join,C#,Linq,Join,我有一个用户列表和另一个用户活动列表。 我想获得包括用户上次活动在内的用户列表。 我试过这个: var usersActivity = from user in Users join activity in Activities on user.Id equals activity.UserId group activity by activity.UserId into UserActivities select new { activity=UserActivit
var usersActivity =
from user in Users
join activity in Activities on user.Id equals activity.UserId
group activity by activity.UserId into UserActivities
select new {
activity=UserActivities.OrderByDescending(g=>g.DateTime).First(),
user=user
}
但它不起作用。它表示:“用户”名称在当前上下文中不存在
我加入或分组的方法是否错误?您可以使用更简单的方法:
var usersActivity =
from user in Users
select new {
activity=Activities.Where(a => a.UserId = user.Id).OrderByDescending(a => a.DataTime).FirstOrDefault(),
user=user
}
尝试按用户分组,而不是按用户ID分组:
var usersActivity =
from user in Users
join activity in Activities on user.Id equals activity.UserId
group activity by user into UserActivities
select new
{
activity = UserActivities.OrderByDescending(g => g.DateTime).First(),
user = UserActivities.Key
};
“它不起作用”:发生了什么?你是否得到一个空列表,一个异常,错误的输出???我用错误更新了我的代码。这很好。但我认为它将为每个用户进行查询。我说的对吗?我的意思是它会为每个用户查询活动表。我想它会生成一个子查询。但是实际的执行计划将取决于您的数据库结构(不仅仅是表,还有索引)。一般来说,SQL Server非常有效地处理子查询。不要提前优化,从一个工作查询开始,只有在必要时才进行优化。这样看起来更好。但是如果我的查询中有另一个join子句呢?例如:在user.Id等于profile.UserId上的UserProfile中加入profile我尝试了您的代码,但配置文件在Key中不可用attribute@desmati在这种情况下,您可以通过new{user,profile}将
组活动用于UserActivities
,然后,您可以通过UserActivities.Key.user
访问用户,并通过UserActivities.Key.profile
配置文件访问用户。我知道这可能与本主题无关,但如何查看此linq查询生成的最终sql?@desmati检查此问题