2

文字列の配列をパラメーターとして受け取り、文字列のコレクションでもあるコレクション プロパティに対してクエリを実行するメソッドがあります。そのプロパティが、パラメーターとして渡された文字列配列内の値の 1 つを持っている場合は、それを返す必要があります。

これが私のコードです:

public IEnumerable<BlogPost> GetAll(string[] tags, 
    bool includeUnapprovedEntries = false) {

    foreach (var tag in tags) {
        foreach (var blogPost in GetAll(includeUnapprovedEntries).
            ToList().Where(x => x.Tags.Any(t => t == tag))) {
            yield return blogPost;
        }
    }
}

ノート:

完全なコードは次のとおりです。

https://github.com/tugberkugurlu/MvcBloggy/blob/master/src/MvcBloggy.Data/DataAccess/SqlServer/BlogPostRepository.cs

これは機能しますが、正しくないようです。いくつかの拡張メソッドを使用してこれを改善できたかもしれませんが、何がトリックを実行し、この実装を正しくするかを理解できませんでした。

何か案が?

4

1 に答える 1

4

これはどう:

public IEnumerable<BlogPost> GetAll(string[] tags,
    bool includeUnapprovedEntries = false) {

    return GetAll(includeUnapprovedEntries)
        .Where(x => x.Tags.Any(t => tags.Contains(t));
}

結果を具体化するために呼び出すことができますToList()。これにより (うまくいけば!) INSQL でクエリが実行されることに注意してください。多数のタグがある場合、それが失敗しても驚かないでしょう。(Entity Framework がその状況をどのように処理するかはわかりません。) ただし、タグの数が少なくても問題ないと思います。

これがサポートされているかどうかは、使用しているエンティティ フレームワークのバージョンによって異なります。このような ( Contains「ローカル」コレクションを使用して SQL で IN に変換する) いくつかの変換が時間の経過とともに改善されたことを覚えているようです。展開するのと同じバージョンに対して開発していることを確認してください:)

于 2012-04-04T07:09:29.153 に答える