繁体   English   中英

LINQ 查询未显示结果 - 使用 WHERE 子句进行左连接

[英]LINQ query not showing results - LEFT join with WHERE clause

这是我第一次接触 LINQ。 我仍然需要围绕结果部分进行思考,但我似乎无法从中得到任何结果。

var institutions = from lots in lotsdb.NEWinstitution
                 join webs in webbitdb.tblinstitution
                 on lots.institutionid equals webs.dispenseinstid into newinsts
                 from webs2 in newinsts.DefaultIfEmpty()
                 where webs2 == null


                 select new
                 {
                  instid = lots.institutionid,
                  instname = lots.institutionname
                 };

        foreach(var instfound in institutions)
   {

       MessageBox.Show(instfound.instid.ToString() + " " + instfound.instname.ToString());
   }

我在 DATASources 列表中使用 Visual Studio 创建的数据集。

以下是我“尝试”以适应 LINQ 的原始 SQL 字符串

string strgetloc = @"
SELECT NEWinstitution.institutionid, NEWinstitution.institutionname
FROM NEWinstitution 
LEFT JOIN tblinstitution 
ON NEWinstitution.institutionid = tblinstitution.dispenseinstid
WHERE (((tblinstitution.institutionid) Is Null));"

你可能需要这样的东西:

var institutions = 
    from lots in lotsdb.NEWinstitution
    join webs in webbitdb.tblinstitution on lots.institutionid equals webs.dispenseinstid
    where webs.IsInstitutionIdNull()

    select new
    {
      instid = lots.institutionid,
      instname = lots.institutionname
     };

当列允许 DBNull 时, IsInstitutionIdNull()方法由 MSDataSetGenerator 生成。 因为您不能将它直接与DBNullnull进行比较。

(修正了一个错字)

所以我最终使用了以下代码:

 var idsNotInB = dtLotsInst.AsEnumerable().Select(r => r.Field<int>("institutionid"))
    .Except(dtWebbitInst.AsEnumerable().Select(r => r.Field<int>("institutionid")));

         count = idsNotInB.Count();

        if (count != 0)
        {
            DataTable dtOnlyLots = (from row in dtLotsInst.AsEnumerable()
                                    join id in idsNotInB
                                    on row.Field<int>("institutionid") equals id
                                    select row).CopyToDataTable();
            using (OleDbConnection con = new OleDbConnection(PackChecker.Properties.Settings.Default["WebbitConnectionString"].ToString()))
            {
                string strgetloc = @"INSERT INTO tblinstitution ( dispenseinstid, institutionname ) VALUES (?,?)";

                using (OleDbCommand cmd = new OleDbCommand(strgetloc, con))
                {

                    con.Open();
                    foreach (DataRow dr in dtOnlyLots.Rows)
                    {
                        cmd.Parameters.Add("?", OleDbType.Integer).Value = Convert.ToInt32(dr["institutionid"]);
                        cmd.Parameters.Add("?", OleDbType.VarWChar).Value = dr["institutionname"].ToString();

                        cmd.ExecuteNonQuery();
                        cmd.Parameters.Clear();


                    }
                    con.Close();
                }


            }
        }

这使用 LINQ,并且通过在第一个 LINQ 部分中使用“EXCEPT”来查找不在一个表中的值,效果很好。 然后它使用这个列表从我想要的表中生成行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM