2012-02-10 4 views
2

Я работаю с DataSet, который содержит две таблицы, из которых я пытаюсь получить данные из LINQ.Как фильтровать коллекцию с помощью LINQ to DataSet

Я изо всех сил пытаюсь понять синтаксис того, как возвращать записи, соответствующие условиям.

Пример:

Вот эти две таблицы:

FooBar Items

FooBar Data

Этот запрос соединяет эти две таблицы (Пункт Z будут отфильтрованы)

private void ParseFooBar() 
{ 
.... 
var fooBars = from item in fooBarItems 
     join data in fooBarData on item["FooBar_Id"] equals data["FooBar_Id"] 
     where (new[] {"A","B","C"}).Contains(item["id"]) 
     select new 
     { 
     id = item["id"], 
     description = item["description"], 
     wat = data["wat"], 
     foo = data["foo"]     
     }; 
} 

Это коллекция, полученная из вышеуказанного запроса.

FooBar Items joined with FooBar Data

Вопрос: Как вернуть только Foo элементы?

Обратите внимание, что элементы Foo имеют в своей первой строке/записи значение, отличное от нуля, в то время как элементы Bar не имеют ненулевого значения в первой строке/записи. Используя тот факт, что все элементы Foo будут иметь по крайней мере один ненулевое значение в столбце foo, а элементы Bar никогда не будут иметь ненулевого значения в столбце foo, как я могу обновить вышеуказанный запрос, чтобы запрос возвращал только элементы Foo ? Аналогично, как я могу обновить запрос, чтобы он возвращал только элементы Bar?

ответ

1

Это не совсем ясно мне, что эти критерии за то, что Foo против Бара, но вот несколько идей:

var foos1 = fooBars.Where(fb => fb.wat != "bar"); 
var foos2 = fooBars.Where(fb => fb.wat == "foo" || fb.wat == null); 
var foos3 = fooBars.Where(fb => fb.wat == "foo" || fb.foo != null); 
var bars = fooBars.Where(fb => fb.wat == "bar" || fb.foo != null); 
1

Это зависит, где вы хотите, чтобы отфильтровать нежелательные nulls вне. Если на присоединяющейся уровне, вы можете немного изменить запрос:

from item in fooBarItems 
join data in fooBarData on item["FooBar_Id"] equals data["FooBar_Id"] 
where (new[] {"A","B","C"}).Contains(item["id"]) && data["foo"] != null 
select new 
{ 
    id = item["id"], 
    description = item["description"], 
    wat = data["wat"], 
    foo = data["foo"]     
}; 

Это будет возвращать только два элемента:

  • A, I am a Foo, null, 10834
  • B, I am a Foo, null, 08385383

Чтобы получить оставшиеся из них (в том числе те, где foo:null еще они белон г до Foo, который имеет не нулевой вход), используйте комбинацию .GroupBy и .Where после основного запроса:

fooBars 
    .GroupBy(f => f.id) 
    .Where(g => g.Any(f => f.foo != null)) 
    .SelectMany(g => g); // just to make it nice list-like looking 

Это будет выбирать целые группы, но только те, которые имеют по крайней мере один foo с не- null (это будут все записи из окончательной коллекции, кроме тех, которые указаны с id = C).

+0

Мне нравится ваша идея с прилагаемой лямбдой - похоже, что это сработает, но это не так.Результат вашего обновленного запроса возвращает коллекцию, отличную от оригинала. Странный. – Jed

+0

@Jed: О, сделал опечатку. Должно быть 'f.foo! = Null', а не' '' '. Исправлено. –

Смежные вопросы