DataTable查询

时间:2008-11-26 19:43:52

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

我是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"));
            }

4 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:0)

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语法。

答案 2 :(得分:0)

我怀疑你比较的一个字段不是数据库中的整数。我相信其中一个Field<int>()调用抛出了无效的强制转换异常,因为这是此方法可以抛出的三个不同异常之一。请参阅文档here

答案 3 :(得分:0)

也许使用.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提到的上述问题也不是问题