1

通常、私はストアドプロシージャを使用し、SQLで作業するので、ここで用語を少し外してしまった場合はお詫びします。

3つの個別のテーブルを持つデータベースがあり、3つのテーブルのそれぞれで複数のフィールドを検索する必要があります。

私はこれを効果的な方法で行っていないことを確信しています。最初は、それを理解するために簡単な設定でそれを行おうとしています。

私は次のものを持っています。

    var foo1 = entities.table1.Where(a => a.bodyText.Contains(searchString) || a.pageTitle.Contains(searchString));
    var foo2 = entities.table2.Where(b => b.newsArticle.Contains(searchString) || b.newsArticle.Contains(searchString));
    var foo3 = entities.table3.Where(c => c.ImageDescriptionContains(searchString));

これらすべての結果を1つのリピーターにまとめて表示する必要があります。

この時点で、3セットのデータはすべて、匿名データの個別の一意のコレクションになっています。では、これらを単一のコヒーレントなバインド可能なソースに変換する最良の方法は何でしょうか。

私は、各リストを順番に繰り返し、表示する必要のあるフィールドを引き出して新しいクラスに入れ、これらのクラスのリストをリピーターにバインドすることを考えていました。

しかし、それはすべて私には少し不格好に思えます。

3つのテーブルすべてを一度に検索し、各テーブルから必要なフィールドだけを共通の名前で返す方法はありますか(つまり、SQLでは次のように記述できます)。

    select b.newsArticle as myText, 

また

    select newsArticle, '' 

ニュース記事と空の文字列を返します)。

4

2 に答える 2

1

これは次のように組み合わされます。

var foos = foo1.ToList();
foos.AddRange(foo2);
foos.AddRange(foo3);

欲しいものを手に入れるには:

var myExtractedValues = foos.Select(x => new { 
         Article = !string.IsNullOrEmpty(x.newsArticle)) 
                           ? x.newsArticle 
                           : string.Empty});

ここでは匿名タイプを使用しましたが、新しい{}を独自のタイプと交換できます。

IsNullOrEmptyの演算子を逆にしますが、これは個人的な好みです(読み取り方法が好きです)。

于 2012-05-17T16:39:06.660 に答える
1

すべての結果を一度に取得するには、結果を格納するために3つのクエリすべてで使用される共通のクラスを定義する必要があります。このクラスも匿名である可能性がありますが、わかりやすくするために名前を付けます。

class Data
{
    public string Text{ get; set;}
}

これで、コードでデータベースからのインスタンスをフェッチDataし、次を使用できますUnion

using( var entities = new YourDataContext)
{
    var foo1 = entities.table1
                       .Where(a => a.bodyText.Contains(searchString) || 
                                   a.pageTitle.Contains(searchString))
                       .Select(a => new Data{ Text = a.bodyText});
    var foo2 = entities.table2
                       .Where(b => b.newsArticle.Contains(searchString) || 
                                   b.newsArticle.Contains(searchString))
                       .Select(b => new Data{ Text = b.newsArticle});
    var foo3 = entities.table3
                       .Where(c => c.ImageDescription.Contains(searchString))
                       .Select(c => new Data{ Text = c.ImageDescription});
    return foo1.Union(foo2).Union(foo3);
}
于 2012-05-18T09:49:43.217 に答える