Как отфильтровать коллекцию, используя LINQ to DataSet - PullRequest
2 голосов
/ 11 февраля 2012

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

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

Пример:

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

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?

Ответы [ 2 ]

1 голос
/ 11 февраля 2012

Это зависит от того, где вы хотите отфильтровать нежелательные 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 с ненулевым значением (которое будетвсе записи из окончательной коллекции, кроме тех, которые имеют id = C).

1 голос
/ 11 февраля 2012

Мне не совсем ясно, каковы критерии того, чтобы быть 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);
...