小编Den*_*sen的帖子

LINQ表达式如何知道Where()出现在Select()之前?

我正在尝试创建一个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.

那么表达式如何排序呢?我没有对指南中的代码进行任何更改.

.net c# linq

9
推荐指数
1
解决办法
3050
查看次数

将操作码设置字段设置为值

我正在尝试动态创建一个代理,所以我很满意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字段,已经花了周末这个,我试图在这个论坛得到一些帮助.谢谢

//丹尼斯

.net reflection.emit

6
推荐指数
1
解决办法
3504
查看次数

标签 统计

.net ×2

c# ×1

linq ×1

reflection.emit ×1