代码之家  ›  专栏  ›  技术社区  ›  John K

将语句Lambda放入LINQ查询时出现问题

  •  2
  • John K  · 技术社区  · 14 年前

    我尝试将一些内联工作作为语句Lambda注入到LINQ查询中 select 就像这样。。。

    // NOTE: mcontext.Gettype() == System.Data.Linq.DataContext
    
    // Okay - compiles, nothing unusual
    var qPeople1 = from ME.tblPeople person in mcontext.tblPeoples
                  select person;
    
    // ERROR - see below compile Error - Can I retrofit this thing?
    var qPeople2 = from ME.tblPeople person in mcontext.tblPeoples
                   select (() => { 
                       return person; 
                   })();
    

    错误2方法名称

    ... 不过,我也很高兴看到Lambda表达式首先内联工作。

    注意

    2 回复  |  直到 14 年前
        1
  •  4
  •   dahlbyk    14 年前

    要执行内联工作,您需要使用两个步骤:1)使用有效的 select 表达式,然后2)将该数据作为IEnumerable操作<&燃气轮机;使用linqto对象来执行内联工作。可能是这样的:

    var qPeople1 = from ME.tblPeople person in mcontext.tblPeoples
                  select person;
    
    var i = 0;
    var qPeople2 = qPeople1.AsEnumerable().Select(person => {
                       i += 1;
                       return person; 
                   });
    
        2
  •  5
  •   Zooba Necrolis    14 年前

    查询语法需要一个方法引用—它不接受lambda,在第二个示例中,您给了它一个 ME.tblPeople 实例。

    但是,如果使用扩展方法语法,则可以轻松实现这一点:

    int i = 0;
    var qPeople3 = (from ME.tblPeople person in mcontext.tblPeoples
                    select person).Select(person => { i += 1; return person; });
    

    (我添加了递增整数作为示例,但请注意,在枚举之前,它实际上不会从零变为零 qPeople3 .)

    这只适用于LINQ到对象。将其与LINQ To SQL查询一起使用 AsEnumerable() Select() 打电话。

    笔记

    你其实不需要 from-in-select 对于这个例子,下面的代码片段(AFAICT)是相同的,但我把它放在上面是为了与前面的例子相似,并说明它是有效的。第二个片段将这两条语句拆分为单独的行,结果也相同。

    int i = 0;
    var qPeople4 = mcontext.tblPeoples.Select<ME.tblPeople,ME.tblPeople>(person => { i += 1; return person; });
    
    int i = 0;
    var qPeople1 = from ME.tblPeople person in mcontext.tblPeoples
                   select person;
    var qPeople5 = qPeople1.Select(person => { i += 1; return person; });