2

次のような結果を返す GroupJoin クエリがあります。

IEnumerable<ICD.ViewModels.HomeSearchViewModel> query = ICDUnitOfWork.AlphaGroups.Find()
    .GroupJoin(ICDUnitOfWork.Alphas.Find(),
        a => a.AlphaGroupID,
        g => g.AlphaGroupID,
        (alphaGroups, alphas) =>
            new ICD.ViewModels.HomeSearchViewModel
            {
                AlphaGroups = alphaGroups,
                Alphas = alphas
            });

Alphas はIEnumerableあり、AlphaGroup には複数の Alpha が含まれます。どちらも「タイトル」というプロパティを持っています。文字列「baby」を含む「Title」プロパティに基づいて結果をフィルタリングする必要があります。どうすればこれを達成できますか?

編集: 特定のアルファ グループ タイトルに「baby」が含まれている場合、AlphaGroupID を持つ対応するすべてのアルファを表示する必要があることにも言及する必要があります。

4

2 に答える 2

1

.Any()ネストされたユニオンにマップできるので、代わりに事前結合をフィルタリングすることをお勧めします

試す

IEnumerable<ICD.ViewModels.HomeSearchViewModel> query = 
     ICDUnitOfWork.AlphaGroups.Find()
                  .Where(g => g.Title.Contains("baby"))
                  .GroupJoin(ICDUnitOfWork.Alphas.Find()
                                          .Where(a => a.Title.Contains("baby"),
                             a => a.AlphaGroupID,
                             g => g.AlphaGroupID,
                             (alphaGroups, alphas) =>
                                new ICD.ViewModels.HomeSearchViewModel
                                 {
                                  AlphaGroups = alphaGroups,
                                  Alphas = alphas
                                 }).AsEnumerable();
于 2012-11-13T18:18:00.860 に答える
1

Entity Framework >= 4 を使用している場合は、次のContainsように動作します。

.Where(row => 
    row.AlphaGroups.Title.Contains("baby") 
        || row.Alphas.Any(alpha => alpha.Title.Contains("baby"))
 );

編集グループ内のアルファを事前にフィルター処理するように更新されました。最後のフィルターは、アルファを含まない行を除外します ( AlphaGroupのタイトルにもどのAlpha にも文字列が含まれていないことを示します)。

IEnumerable<ICD.ViewModels.HomeSearchViewModel> query = ICDUnitOfWork.AlphaGroups.Find()
    .GroupJoin(ICDUnitOfWork.Alphas.Find(),
        a => a.AlphaGroupID,
        g => g.AlphaGroupID,
        (alphaGroups, alphas) =>
            new ICD.ViewModels.HomeSearchViewModel
            {
                AlphaGroups = alphaGroups,
                Alphas = alphas.Where(alpha 
                    => alphaGroups.Title.Contains("baby")
                        || alpha.Title.Contains("baby"))
            });
    .Where(row => row.Alphas.Any());
于 2012-11-13T17:46:16.497 に答える