【问题标题】:Sql inner join a select syntax to lambdas .join() syntaxSql 内连接一个选择语法到 lambdas .join() 语法
【发布时间】:2013-04-12 14:31:01
【问题描述】:

我收到了这个问题:

select t.user
     , t.loginDate 
from t_login as t
inner join 
(
    select user, max(loginDate) as mostRecentLoginDate 
    from t_login 
    group by user
) as tt
    on t.user = tt.user 
   and t.loginDate = tt.mostRecentLoginDate ;

这个查询效果很好,它为我的用户提供了最近的 loginDate。

现在我想为我的 C# 代码使用 Lambdas 语法中的这个查询。

这可能吗?

编辑:

C#代码:

myApp.DataLayer dl = new myapp.DataLayer();
IQueryable<Logins> logins = dl.getAllLogins();

if(displayRecent)
{
    logins = logins.Where(p => p.LoginDate == logins.Where(pp => pp.User == p.User).Max(pp => pp.LoginDate));
}

foreach (Login login in logins) // here it crash with StackOverflow exception

【问题讨论】:

    标签: c# sql syntax lambda


    【解决方案1】:

    尝试以下方法:

    var latestLogin = logins.Where(u => u.user == "userName").Max(u => u.logindate);
    

    【讨论】:

      【解决方案2】:

      这是一个使用 Linq 反对的测试。它应该适用于 Linq to SQL:

          public class Login { public DateTime loginDate { get; set; } public string user { get; set; } }
      
          [TestMethod()]
          public void foo()
          {
              var logins = new[] { 
                new Login() { loginDate = new DateTime(2013, 5, 1), user = "u1" }
              , new Login() { loginDate = new DateTime(2013, 5, 2), user = "u1" }
              , new Login() { loginDate = new DateTime(2013, 5, 3), user = "u2" }
              , new Login() { loginDate = new DateTime(2013, 5, 4), user = "u2" }
      
              };
      
              var lastLogins = logins.Where(l =>
                          l.loginDate == logins.Where(ll => ll.user == l.user)
                                               .Max(ll => ll.loginDate)
              ).ToList();
          }
      

      【讨论】:

      • 此代码原因:当我在登录中进入我的 foreach 登录时,mscorlib.dll 中发生了“System.StackOverflowException”类型的未处理异常
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      相关资源
      最近更新 更多