C# LINQ:为什么Expression.Call()引用Db,而CreateQuery()也引用Db?

C# LINQ:为什么Expression.Call()引用Db,而CreateQuery()也引用Db?,c#,linq,linq-to-sql,linq-to-entities,C#,Linq,Linq To Sql,Linq To Entities,所以我试图优化一个查询,它对1000行进行文本搜索,并显示100行。为此,我试图从微软的101个示例查询(已找到)中理解一些代码 以下是我希望理解的代码: [Category("Advanced")] [Title("Dynamic query - Where")] [Description("This sample builds a query dynamically to filter for Customers in London.")] public vo

所以我试图优化一个查询,它对1000行进行文本搜索,并显示100行。为此,我试图从微软的101个示例查询(已找到)中理解一些代码

以下是我希望理解的代码:

    [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);
    }
[类别(“高级”)]
[标题(“动态查询-其中”)]
[说明(“此示例动态构建查询以筛选伦敦的客户。”)]
public void LinqToSqlAdvanced02()
{
IQueryable custs=db.Customers;
ParameterExpression param=表达式参数(typeof(Customer),“c”);
表达式右=表达式常数(“伦敦”);
表达式left=Expression.Property(param,typeof(Customer).GetProperty(“City”);
表达式过滤器=表达式.Equal(左、右);
表达式pred=Expression.Lambda(过滤器,参数);
Expression expr=Expression.Call(typeof(Queryable),“Where”,新类型[]{typeof(Customer)},Expression.Constant(custs),pred);
IQueryable query=db.Customers.AsQueryable().Provider.CreateQuery(expr);
ObjectDumper.Write(查询);
}

所以…我意识到这很难理解,但是为什么Expression.Call()需要DbSet引用它作为
传递给CreateQuery?

我相信您要问的是为什么在
Expression.Call中需要第三个参数(类型数组)。因为如果您是通过代码执行的,那么您只需执行以下操作:

custs.Where(pred);
代码在没有泛型参数的情况下工作的原因是隐式类型,编译器会自动将其转换为:

custs.Where<Customer>(pred);
custs.Where(pred);
翻译后,实际字节码包含指定泛型的调用。当您构建
表达式时
,您没有隐式键入这样的所有细节,因此您必须准确地指定调用的内容