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

时间:2017-09-11 13:21:56

标签: c# linq

这是我第一次涉足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));"

2 个答案:

答案 0 :(得分:0)

你可能需要这样的东西:

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时,MSDataSetGenerator会生成IsInstitutionIdNull()方法。因为您无法将其直接与DBNullnull进行比较。

(修正了错字)

答案 1 :(得分:0)

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

 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”来查找不在一个表中的值。 然后它使用此列表从我想要的表生成行:)

谢谢大家的帮助。