1

2レベルの深さをフィルタリングする必要があるラムダ式があります。「Panel」という親がいます。Panelには多くの「Documents」を含めることができ、特定のドキュメントタイプのドキュメントを含むすべてのPanelとそれに関連するドキュメントを返す必要があります...ドロップダウンリスト値として渡されます。

これは私が持っているものです:(表示のために少し変更しました)

using (MyEntities ctx = new MyEntities())
{
    var query = ctx.Panels.Where(p => p.blah blah blah).ToList();

    if (DDL.SelectedValue!= string.Empty)
    {
        query = query.Where(p => p.Documents.Any(d => d.DocumentTypeID ==  DDL.SelectedValue.ToInt32Extension())).ToList();
    }             
    rptPanelReviews.DataSource = query
    rptPanelReviews.DataBind();
}

...ご覧のとおり、私は.Any()Documentsオブジェクトのメソッドを使用していますが、それは無関係な情報を返します。このAll()メソッドは何も返しません。特定のドキュメントタイプを持つすべてのパネルとドキュメントを返す他のメソッドが見つかりません。

誰かがこれについて行く方法を知っていますか?それも可能ですか?Whereステートメント内でこのタイプのクエリを実行できますか?

4

2 に答える 2

1

クエリは正しいようです (必要なタイプのドキュメントが少なくとも 1 つあるすべてのパネルを返します) が、現在メモリ内で 2 番目のフィルタリングが実行されています。ToList()クエリ結果をデータ ソースとして割り当てるときまで削除することをお勧めします。

using (MyEntities ctx = new MyEntities())
{
    var query = ctx.Panels.Where(p => p.blah blah blah);

    if (DDL.SelectedValue != String.Empty)
    {
        var docTypeID = DDL.SelectedValue.ToInt32Extension();
        query = query.Where(p => p.Documents.Any(d => d.DocumentTypeID == docTypeID));
    }             

    rptPanelReviews.DataSource = query.ToList();
    rptPanelReviews.DataBind();
}

更新: Linq を使用して不適切なタイプのドキュメントを削除することはできません。フィルター処理されたドキュメントでのみ新しいオブジェクトを作成できます

if (DDL.SelectedValue != String.Empty)
{
   var docTypeID = DDL.SelectedValue.ToInt32Extension();
   rptPanelReviews.DataSource =
           query.Where(p => p.Documents.Any(d => d.DocumentTypeID == docTypeID))
                .Select(p => {
                    // copy required properties
                    Documents = p.Documents
                                 .Where(d => d.DocumentTypeID == docTypeID)
                                 .ToList()
                }).ToList();
}
于 2013-02-04T19:57:23.297 に答える
1

テストされていませんが、このようなものから始める必要がありますか?

var res = from p in ctx.Panels
          where p.id = blah
          select new
          {
             p.Name,
             Docs = p.Where(d => d.DocumentTypeID ==  DDL.SelectedValue.ToInt32Extension())
          } 
于 2013-02-04T19:53:13.587 に答える