1

我是 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

4 回答 4

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

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

于 2008-11-26T20:17:55.943 回答
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 语法。

于 2008-11-27T00:25:51.967 回答
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 提到的上述问题也不是问题

于 2008-11-27T14:38:27.737 回答
0

我怀疑您要比较的字段之一不是数据库中的整数。我相信无效转换异常是由其中一个Field<int>()调用引发的,因为这是该方法可以引发的三种不同异常之一。请参阅此处的文档。

于 2008-11-27T03:55:46.143 回答