2

DataSetLINQ 経由でデータを取得しようとしている 2 つのテーブルを含む を使用しています。

条件を満たすレコードを返す方法の構文を理解するのに苦労しています。

例:

以下に 2 つのテーブルを示します。

FooBar アイテム

FooBar データ

このクエリは 2 つのテーブルを結合します(アイテム 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 データに結合された FooBar アイテム

質問: Foo アイテムのみを返品するにはどうすればよいですか?

Foo アイテムの最初の行/レコードに null 以外の値が含まれているのに対し、Bar アイテムの最初の行/レコードには null 以外の値が含まれていないことに注意してください。すべての Foo 項目の foo 列に少なくとも 1 つの非 null 値があり、Bar 項目の foo 列に非 null 値が含まれないという事実を利用して、クエリが Foo 項目のみを返すように上記のクエリを更新するにはどうすればよいですか? ? 同様に、Bar アイテムのみを返すようにクエリを更新するにはどうすればよいですか?

4

2 に答える 2

1

Foo対Barであるための基準が何であるかは私には完全には明らかではありませんが、ここにいくつかのアイデアがあります:

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);
于 2012-02-10T20:17:14.370 に答える
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"]                 
};

これは 2 つの要素のみを返します。

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

残りのもの ( null 以外のエントリを持つ Foo にまだ属しているものを含む) を取得するには、メインクエリの後に と の組み合わせを使用foo ます。null.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

これにより、グループ全体が選択されますが、null 以外の値を持つものが少なくとも1つあるグループのみが選択されfooます (これは、最終コレクションからのすべてのエントリであり、 を持つものを除きますid = C)。

于 2012-02-10T20:36:38.997 に答える