C# LINQ:为什么Expression.Call()引用Db,而CreateQuery()也引用Db?
所以我试图优化一个查询,它对1000行进行文本搜索,并显示100行。为此,我试图从微软的101个示例查询(已找到)中理解一些代码 以下是我希望理解的代码: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
[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);
翻译后,实际字节码包含指定泛型的调用。当您构建表达式时
,您没有隐式键入这样的所有细节,因此您必须准确地指定调用的内容