【问题标题】:Change syntax to Linq to SQL lambda join将语法更改为 Linq to SQL lambda join
【发布时间】:2016-05-26 20:39:48
【问题描述】:

我想将我的 linq 语句从查询语法切换到 lambda,对我来说最难理解的部分是 lambda join

 from ru in db.rpm_usr
    join ei in db.emp_info on ru.wwid equals ei.wwid

所以上面那个查询连接语法很简单,但是当我尝试将它放入 lambda 中时

这对我不起作用

  .Join(Rpm_scrty_emp_info, p => p.Iact_ind, j => j.Wwid

完整查询:

        var queryAllUsers = (from ru in db.rpm_usr
                                  join ei in db.emp_info on ru.wwid equals ei.wwid
                                  let cdis_eml = ei.dmn_addr + ";"
                                  where ru.inact_ind == "N" && ei.inact_ind == "N" && ei.dmn_addr != null
                                  orderby ei.dmn_addr
                                  select new rpm_scrty_rpm_usr()
                                  {

                                      usr_id = ru.usr_id,
                                      usr_lnm = ru.usr_lnm,
                                      usr_pwd = ru.usr_pwd,
                                      usr_fnm = ru.usr_fnm,
                                      wwid = ru.wwid,
                                      apprvr_wwid = ru.apprvr_wwid,
                                      chg_dtm = ru.chg_dtm,
                                      chg_usr_id = ru.chg_usr_id,
                                      dflt_ste_id = ru.dflt_ste_id,
                                      cre_dtm = ru.cre_dtm,
                                      cre_usr_id = ru.cre_usr_id,
                                      lst_pwd_chg_dtm = ru.lst_pwd_chg_dtm,
                                      lst_accs_dtm = ru.lst_accs_dtm,
                                      email_id = ru.email_id,
                                      inact_ind = ru.inact_ind,
                                      salt = ru.salt,
                                      tel = ru.tel
                                  }).ToList();

【问题讨论】:

  • 使用 Linqpad 看看它如何将您的查询转换为 lamda 语法。对于它的价值,我总是使用查询语法来连接,因为它产生更好的可读代码。
  • 我同意我更喜欢查询语法。有一些公司标准等,我确实使用 Linqpad,但我从来没有发现 linqpad 能真正帮助我处理 sytax,哦,它真的表明了吗?

标签: c# linq linq-to-sql lambda


【解决方案1】:

我个人发现通过将查询分解为单独的行更容易以点表示法更好地理解 LINQ。

根据上面@Tom 的示例,查询分解如下:

user.Join(Rpm_scrty_emp_info,  // We want to join user to Rpm_scrty_emp_info
      z => z.Wwid,             // On the left "user" side of the join we want to use the Wwid property
      ei => ei.Wwid,           // On the right "employee info" side of the join we want to use the Wwid property 
      (z, ei) => z)            // We then want to return the results on the left side of the join, i.e. our z objects

您还可以按照@Tom 的第一个示例,利用匿名对象返回连接的两边,甚至返回特定属性。

如果您还没有,我强烈推荐软件 LINQpad。它非常适合调试 LINQ,并且还具有用于在查询和 lambda 语法之间切换的内置转换器。

【讨论】:

  • 再次感谢,这些解释真的很有帮助,。我同意 lambda 读起来很粗糙我可以使用简单的 lambda,就像我在 .Where 中使用过的一样,但是 .Join 是荒谬的 IMO,只是我被告知要使用的标准编码实践 thx
【解决方案2】:

我不确定它是否真的“值得”,因为 lambda 加入我并不漂亮,像这样。

我错了,这将导致Anonymous Type issue 出现问题

不要这样做

.Join (db.emp_info,  ru => ru.wwid, ei => ei.wwid, (ru, ei) => new { ru = ru, ei = ei })

改为这样做

.Join(Rpm_scrty_emp_info, z => z.Wwid, ei => ei.Wwid, (z, ei) => z)

【讨论】:

  • 哦,第二个有效,但另一个人回答了我问的另一个问题,谢谢
  • 没问题,OP解释得很好,保重
猜你喜欢
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多