C# 使用LINQ获取一个数据表中存在的数据,而不是另一个数据表中存在的数据

C# 使用LINQ获取一个数据表中存在的数据,而不是另一个数据表中存在的数据,c#,linq,datatable,C#,Linq,Datatable,我有两个DataTables。我想得到第一个中存在但第二个中不存在的东西。我想在另一个数据表中查看结果。我想使用LINQ 第一个数据表: 第二个数据表: 注意:我从两个数据表返回的列名: crs\u名称 name 您想使用除扩展名以外的 以下是MSDN上linq的链接 从我从这个问题中得到的类似的东西 var theNonIntersect = dt1.AsEnumerable().select(r => r.Field<string>("crs_name

我有两个
DataTable
s。我想得到第一个中存在但第二个中不存在的东西。我想在另一个
数据表中查看结果。我想使用LINQ

  • 第一个数据表:

  • 第二个数据表:

注意:我从两个数据表返回的列名:

  • crs\u名称

  • name


  • 您想使用除扩展名以外的

    以下是MSDN上linq的链接

    从我从这个问题中得到的类似的东西

    var theNonIntersect = 
        dt1.AsEnumerable().select(r => r.Field<string>("crs_name"), r.Field<string>("name"))
            .Except(dt2.AsEnumerable().select(r => r.Field<string>("crs_name"), r.Field<string>("name")));
    
    var theNonIntersect=
    dt1.AsEnumerable().select(r=>r.Field(“crs_name”)、r.Field(“name”))
    。除了(dt2.AsEnumerable()。选择(r=>r.Field(“crs_name”)、r.Field(“name”));
    
    您好,希望这段代码能帮助您,如果我有误解,可以请我编辑这篇文章

    DataContext db = new DataContext();
    var result  = from a in db.dt1
                  from b in db.dt2
                  where a.crs_name != b.name
                  select a.crs_names;
    
    foreach(var names in result)
    {
      dt2Entity obj = new dt2Entity();
      obj.name = names.name;
      db.InsertOnSubmit(obj);
      db.SubmitChanges();
    }
    

    这将为您带来好处:

    var rowsOnlyInDt1 = dt1.AsEnumerable().Where(r => !dt2.AsEnumerable()
                        //make sure there aren't any matching names in dt2
                        .Any(r2 => r["crs_name"].Trim().ToLower() == r2["crs_name"].Trim().ToLower() && r["name"].Trim().ToLower() == r2["name"].Trim().ToLower()));
    
    或者,如果您更喜欢查询语法:

    var rowsOnlyInDt1 = from r in dt1.AsEnumerable()
                        //make sure there aren't any matching names in dt2
                        where !dt2.AsEnumerable().Any(r2 => r["crs_name"].Trim().ToLower() == r2["crs_name"].Trim().ToLower() && r["name"].Trim().ToLower() == r2["name"].Trim().ToLower())
                        select r;
    
    然后,您可以使用以下函数将结果放入数据表:

    DataTable result = rowsOnlyInDt1.CopyToDataTable();
    

    数据表来自哪里?如果数据在SQL Server中,SQLMetal可以生成您的DBML,这样您就可以在实体中工作,LINQ变得更容易。(特别是如果外键正确的话)。嗯,很抱歉,这是Informix数据库。
    无法将lambda表达式转换为字符串,因为它不是委托。
    尝试一下,将Linq添加到
    数据表
    扩展HMMMM。没有语法错误,但很抱歉它不起作用。我在第一个datatable.hmmm中得到了相同的记录,这里的
    r.Field(“name”)
    语法错误<代码>r
    在当前上下文HMMM中不存在,我不使用LINQ to sql。只想用LINQ回答我的问题。我不知道什么是
    db
    ?比较应该在
    a.crs\u name和b.crs\u name之间
    a.name和b.name
    比较应该在
    a.crs\u name和b.crs\u name之间。。不在
    crs\u name和name
    之间。我的意思是两个数据表中有两个同名字段:
    dt1:crs\u name,name
    dt2:crs\u name,name
    。我想将第一个字段与第一个字段进行比较,第二个字段与第二个字段进行比较。啊哈!好的,我现在明白了。给我一点时间,我会整理我已经更新了我的答案,这更符合你的要求吗?
    var rowsOnlyInDt1 = from r in dt1.AsEnumerable()
                        //make sure there aren't any matching names in dt2
                        where !dt2.AsEnumerable().Any(r2 => r["crs_name"].Trim().ToLower() == r2["crs_name"].Trim().ToLower() && r["name"].Trim().ToLower() == r2["name"].Trim().ToLower())
                        select r;
    
    DataTable result = rowsOnlyInDt1.CopyToDataTable();