DataTable Query - PullRequest
       7

DataTable Query

1 голос
/ 26 ноября 2008

Я новичок в LINQ. Я пытаюсь найти строки, которых нет во второй таблице данных.

report_list и эталонный тест: Тип 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 ]

1 голос
/ 26 ноября 2008

Не знаю, понял ли я ваш вопрос. Вы пытаетесь получить элементы, которые существуют в первой таблице, но не во второй?


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

Я предлагаю вам сначала сделать внутренний запрос, если он не зависит от внешней записи.

0 голосов
/ 27 ноября 2008

Возможно, использовать расширение .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")})

На самом деле не уверен в точном синтаксисе, но это должно сработать, взяв идентификаторы в бенчмарке, а затем удалив все эквивалентные идентификаторы в report_list, оставив только идентификаторы, которые не совпадают. (Я надеюсь, что это был порядок, после которого вы ...)

Примечание: это также предполагает, что вышеупомянутая проблема, упомянутая tvanfosson, также не является проблемой

0 голосов
/ 27 ноября 2008

Я подозреваю, что одно из сравниваемых полей не является целым числом в базе данных. Я считаю, что недопустимое исключение приведения вызывается одним из вызовов Field<int>(), поскольку это одно из трех различных исключений, которые может вызвать этот метод. Смотри документы здесь .

0 голосов
/ 27 ноября 2008
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.

...