LINQ: Почему Expression.Call () ссылается на Db, когда CreateQuery () тоже? - PullRequest
1 голос
/ 02 августа 2011

Итак, я пытаюсь оптимизировать запрос, который выполняет текстовый поиск по 1000 строк и отображает 100 из них. Для этого я пытаюсь понять некоторый код из 101 образца запросов Microsoft (найдено здесь ).

Вот код, который я хочу понять:

    [Category("Advanced")]
    [Title("Dynamic query - Where")]
    [Description("This sample builds a query dynamically to filter for Customers in London.")]
    public void LinqToSqlAdvanced02()
    {
        IQueryable<Customer> custs = db.Customers;
        ParameterExpression param = Expression.Parameter(typeof(Customer), "c");
        Expression right = Expression.Constant("London");
        Expression left = Expression.Property(param, typeof(Customer).GetProperty("City"));
        Expression filter = Expression.Equal(left, right);
        Expression pred = Expression.Lambda(filter, param);

        Expression expr = Expression.Call(typeof(Queryable), "Where", new Type[] { typeof(Customer) }, Expression.Constant(custs), pred);
        IQueryable<Customer> query = db.Customers.AsQueryable().Provider.CreateQuery<Customer>(expr);
        ObjectDumper.Write(query);
    }

Итак ... Я понимаю, что это эзотерика, но зачем Expression.Call () нужна ссылка на DbSet, переданная в CreateQuery как <T>?

1 Ответ

3 голосов
/ 02 августа 2011

Я полагаю, что вы спрашиваете, почему третий параметр (массив типов) необходим в Expression.Call, потому что, если вы сделали это с помощью кода, вам нужно будет сделать только это:

custs.Where(pred);

Причина, по которой код работает без универсального параметра, заключается в том, что неявная типизация , где компилятор автоматически преобразует это в:

custs.Where<Customer>(pred);

После его переводаэто, фактический байт-код содержит вызов с указанными обобщениями.Когда вы создаете Expression, у вас нет всех тонкостей, таких как неявная типизация, поэтому вы должны точно указать, что вызывается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...