1

我有一个需要过滤 2 个级别的 lambda 表达式。我有一个名为“面板”的父级,一个面板可以包含许多“文档”,我需要返回所有面板及其相关文档,这些文档具有某种文档类型的文档......作为下拉列表值传入。

这就是我所拥有的:(出于显示目的,我对其进行了一些修改)

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

未经测试,但这样的事情应该让你开始?

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 回答
1

您的查询似乎正确(它返回所有面板,其中至少有一个所需类型的文档),但第二次过滤当前在内存中执行。我建议您删除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 回答