Динамическое строительное выражение linq

Мне нужно создать динамическое выражение linq для динамического поиска. Базовый поиск работает, но не работает с коллекцией. Я могу получить название и автора книги, но не могу получить требуемый заголовок страницы. Я получаю исключение в очереди"left11 = Expression.Property (page1," Heading ");". Я думаю, что выражение, которое я построил, не может распознать Список. Как это могло быть возможно? Пожалуйста, смотрите ниже код и исключение stacktrace.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;

namespace XMLStorageAndFilter
{
public class Books
{
    public Books()
    {
        Page = new List<Page>();
    }
    public string Title { get; set; }
    public Author Author { get; set; }
    public List<Page> Page { get; set; }
}
public class Author
{
    public string FirstName { get; set; }
}
public class Page
{
    public string Heading { get; set; }
}

public class Program2
{
    static void Main()
    {
        Page page = new Page();
        page.Heading = "Heading";
        Books bok = new Books();
        bok.Title = "Title";
        bok.Author = new Author() { FirstName = "FirstName" };
        bok.Page.Add(page);
        List<Books> testList = new List<Books>();
        testList.Add(bok);

        IQueryable<Books> queryableTestData = testList.AsQueryable<Books>();
        ParameterExpression pe11 = Expression.Parameter(typeof(Books), "p");

        Expression left11 = Expression.Property(pe11, "Title");
        Expression right11 = Expression.Constant("Title");
        Expression e11 = Expression.Equal(left11, right11);

        var author = Expression.Property(pe11, "Author");
        left11 = Expression.Property(author, "FirstName");
        right11 = Expression.Constant("FirstName");
        Expression e21 = Expression.Equal(left11, right11);

        Expression predicateBody11 = Expression.And(e11, e21);
        Expression<Func<Books, bool>> condition = Expression.Lambda
                  <Func<Books, bool>>(predicateBody11, new ParameterExpression[] { pe11 });
        var q = queryableTestData.Where(condition);


        var page1 = Expression.Property(pe11, "Page");
        left11 = Expression.Property(page1, "Heading");
        right11 = Expression.Constant("Heading");
        Expression e22 = Expression.Equal(left11, right11);

        Expression predicateBody12 = Expression.And(e11, e22);

        Expression<Func<Books, bool>> condition2 = Expression.Lambda
                    <Func<Books, bool>>(predicateBody12, new ParameterExpression[] { pe11 });

        var qq1 = queryableTestData.Where(condition2);
    }
}
}

Сообщение об исключении: - {"Свойство экземпляра 'Заголовок' не определено для типа> 'System.Collections.Generic.List`1 [XMLStorageAndFilter.Page]'"}

Трассировки стека:-
в System.Linq.Expressions.Expression.Property (Выражение выражения, String propertyName)
в XMLStorageAndFilter.Program2.Main () в c: \ Users \ Администратор \ Documents \ Visual Studio 2013 \ Projects \ XMLStorageAndFilter \ NavProperty.cs: строка 61
в System.AppDomain._nExecuteAssembly (сборка RuntimeAssembly, аргументы String [])
в System.AppDomain.ExecuteAssembly (String assemblyFile, Evidence assemblySecurity, String [] args)
в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly ()
в System.Threading.ThreadHelper.ThreadStart_Context (состояние объекта)
в System.Threading.ExecutionContext.RunInternal (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта, логическое preserveSyncCtx)
в System.Threading.ExecutionContext.Run (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта, логическое preserveSyncCtx)
в System.Threading.ExecutionContext.Run (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта)
в System.Threading.ThreadHelper.ThreadStart ()

Ответы на вопрос(5)

Ваш ответ на вопрос