将 Linq 的语法更改为 SQL lambda join
Change syntax to Linq to SQL lambda join
我想将我的 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();
我不确定它是不是真的 "worth" 它作为 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)
我个人发现将查询分解为单独的行更容易更好地理解点表示法中的 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 的第一个示例并利用匿名对象 return 连接的两侧,甚至是特定属性。
如果您还没有,我强烈推荐 LINQpad 这个软件。它非常适合调试 LINQ,还有一个用于在查询和 lambda 语法之间切换的内置转换器。
我想将我的 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();
我不确定它是不是真的 "worth" 它作为 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)
我个人发现将查询分解为单独的行更容易更好地理解点表示法中的 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 的第一个示例并利用匿名对象 return 连接的两侧,甚至是特定属性。
如果您还没有,我强烈推荐 LINQpad 这个软件。它非常适合调试 LINQ,还有一个用于在查询和 lambda 语法之间切换的内置转换器。