我正在尝试创建一个LINQ提供程序.我正在使用指南LINQ:构建一个IQueryable提供程序系列,我已经将代码添加到LINQ:构建一个IQueryable提供程序 - 第四部分.
我正在感受它是如何工作的以及它背后的想法.现在我遇到了一个问题,这不是代码问题,而是关于理解的问题.
我正在解雇这个声明:
QueryProvider provider = new DbQueryProvider();
Query<Customer> customers = new Query<Customer>(provider);
int i = 3;
var newLinqCustomer = customers.Select(c => new { c.Id, c.Name}).Where(p => p.Id == 2 | p.Id == i).ToList();
Run Code Online (Sandbox Code Playgroud)
不知何故,代码或表达式知道它Where来自之前Select.但是如何以及在哪里?
在代码中没有办法对表达式进行排序,实际上ToString()在调试模式下,表明Select出现在Where.
我试图让代码失败.正常我做了Where第一个,然后是Select.
那么表达式如何排序呢?我没有对指南中的代码进行任何更改.
我正在尝试动态创建一个代理,所以我很满意Emit.因此,当我使用emit设置我的字段时,我还需要将isDirty字段boolan设置为true.
我怎样才能做到这一点 ?
Property Customer
{
set
{
this.customerName = value;
this.isDirty = true;
}
}
Run Code Online (Sandbox Code Playgroud)
发出代码:
FieldBuilder isDirtyField = myTypeBuilder.DefineField("isDirty", typeof(bool), FieldAttributes.Private);
// Define the "set" accessor method for CustomerName.
MethodBuilder custNameSetPropMthdBldr =
myTypeBuilder.DefineMethod("set_CustomerName",
getSetAttr,
null,
new Type[] { typeof(string) });
ILGenerator custNameSetIL = custNameSetPropMthdBldr.GetILGenerator();
custNameSetIL.Emit(OpCodes.Ldarg_0);
custNameSetIL.Emit(OpCodes.Ldarg_1);
custNameSetIL.Emit(OpCodes.Stfld, customerNameBldr);
{
custNameSetIL.EmitWriteLine("Start isDirty");
... do stuf here
custNameSetIL.EmitWriteLine("End isDirty");
}
custNameSetIL.Emit(OpCodes.Ret);
Run Code Online (Sandbox Code Playgroud)
这段代码正在运行,只要我没有尝试做isDirty字段,已经花了周末这个,我试图在这个论坛得到一些帮助.谢谢
//丹尼斯