簡體   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