2017-09-11 57 views
0

这是我第一次进入LINQ。 我仍然不得不围绕结果部分,但我似乎无法得到任何结果。LINQ查询不显示结果 - 左加入WHERE子句

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创建的数据集。

下面是我原来的SQL字符串,我有“尝试”,以适应LINQ

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

你真的只需要空的吗? '在哪里webs2 == null' –

+0

我一直canabalising LINQ的例子..我猜这是不正确的。 我想lotsdb.NEWinstitution.institutionid WHERE webbitdb.tblinstitution.institutionid IS NULL –

+0

您确定此查询返回结果吗?你有没有试过在SQL Server中运行类似的东西? – gh9

回答

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 
    }; 

由MSDataSetGenerator时产生的IsInstitutionIdNull()方法列允许DBNull。因为您无法直接将其与DBNullnull进行比较。

(固定错字)

+0

mmm中的所有机构,感谢您的建议。我不得不承认我在这里没有深度,也不知道如何获得IsInstitutionIdNull()工作 –

+0

我的其他选项(我能够)将数据从LOTS导入到WEBS tmp表中,然后运行一个普通的SQL加入......但这似乎是一件坏事。 –

+0

@GlennAngel如果你打开XSD,你会得到一个设计师。在“允许为空”上检查“InstitutionId”列。如果它允许为null,那么生成器将生成该方法,并且可以在后面的代码中使用它。 –

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部分,以查找值效果很好不在一张桌子上。 然后它使用这个列表来生成我想要的表中的行:)

感谢fr帮助大家。