【问题标题】:DataTable Query数据表查询
【发布时间】:2008-11-27 22:38:27
【问题描述】:

我是 LINQ 的新手。我正在尝试查找第二个数据表中不存在的行。

report_list 和 benchmark 两种类型都是:DataTable。使用 OleDbCommand、OleDbDataAdapter 填充这两个数据表。我收到一个错误“指定的演员表无效。”在 foreach ...循环中。非常感谢您的帮助。

            var result = from a in report_list.AsEnumerable()
                         where !(from b in benchmark.AsEnumerable()
                                 select b.Field<int>("bench_id")
                                )
                                .Contains(a.Field<int>("BenchmarkID"))
                         select a;



            foreach (var c  in result)
            {
                Console.WriteLine(c.Field<string>("Name"));
            }

【问题讨论】:

    标签: linq linq-to-sql linq-to-objects


    【解决方案1】:

    我不知道我是否理解你的问题。您是否尝试获取第一个表中存在但第二个表中不存在的项目?

    
    var first = new string[] { "b", "c" };
    var second = new string[] { "a", "c" };
    //find the itens that exist in "first" but not in "second"
    var q = from f in first
            where !second.Contains(f)
            select f;
    foreach (var s in q) {
        Console.WriteLine(s);
    }
    
    //Prints:
    //b
    

    我建议你先进行内部查询,一旦它不依赖于外部记录。

    【讨论】:

      【解决方案2】:
      From a in report_list
      Group Join b in benchmark On a.bench_id Equals b.bench_id Into g = Group
      Where g.Count = 0
      Select a
      

      注意这是 VB 语法。

      【讨论】:

        【解决方案3】:

        我怀疑您要比较的字段之一不是数据库中的整数。我相信 Field&lt;int&gt;() 调用之一正在抛出无效的强制转换异常,因为这是该方法可以抛出的三种不同异常之一。请参阅文档here

        【讨论】:

          【解决方案4】:

          也许使用 .Except() 扩展来获取两个集合的集合差?

          (from b in benchmark.AsEnumerable()  
              select new { id = b.Field<int>("bench_id")}).Except(
                   from a in report_list.AsEnumerable() 
                       select new {id = a.Field<int>("BenchmarkID")})
          

          实际上不确定确切的语法,但这应该可以通过在基准测试中获取 id,然后删除 report_list 中的所有等效 id,只留下不匹配的 id。 (我希望这是你所追求的顺序......)

          注意:这也是假设 tvanfosson 提到的上述问题也不是问题

          【讨论】:

            猜你喜欢
            • 2023-03-30
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-04-07
            • 2019-02-10
            • 1970-01-01
            相关资源
            最近更新 更多