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检查此问题