2010-07-16 96 views
2

我试图注入一些行内的工作作为一个声明LAMBDA到LINQ查询select像这样内...无法把声明LAMBDA LINQ查询

// 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; 
       })(); 

错误:

Error 2 Method name expected file.cs 166 27 MigrationCore

...但我也很高兴看到一个表达式Lambda首先内联工作。

注意:我知道代码示例在其努力中是多余的,但我正在寻找基本概念。如果可行,我会扩大它。

+0

该错误告诉你,编译器看到这是一个函数调用,如果删除尾随括号会发生什么? – 2010-07-16 00:35:13

+0

@Kjartan:删除parens会给出错误:'select子句中表达式的类型不正确。在'Select'的调用中类型推断失败。' – 2010-07-16 03:20:31

回答

4

有两种lambda表达式:匿名委托和表达式树。前一种由LINQ用于对象,并允许任何有效的匿名方法体。后一种由LINQ to SQL使用,并要求它的主体是一个表达式。然后这个表达式被传递到L2SQL运行时并被操作到发送到服务器的SQL中。要执行您的内联工作,您需要使用两个步骤:1)获取有效的select表达式的SQL数据,然后2)将该数据作为IEnumerable使用LINQ to Objects进行内联工作。这可能看起来像这样:

var qPeople1 = from ME.tblPeople person in mcontext.tblPeoples 
       select person; 

var i = 0; 
var qPeople2 = qPeople1.AsEnumerable().Select(person => { 
        i += 1; 
        return person; 
       }); 
+0

这说明了我的情况。我很高兴你看到DataContext被用于SQL。我运行代码,它运作良好。谢谢。 – 2010-07-16 04:19:58

5

查询语法需要一个方法引用 - 它不会接受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查询中使用它,在调用Select()之前需要调用AsEnumerable()

注意

你实际上并不需要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; }); 
+0

您的** qPeople3 **语句给我CSC 3.5编译错误:'带有语句正文的lambda表达式不能转换为表达式树结构' – 2010-07-16 02:57:00

+0

其实这些编译 - 他们都给出了上述的编译错误。 – 2010-07-16 03:14:43

+0

现在我意识到你可能没有看到源代码中的数据上下文。一个'AsEnumerable'将需要这里回答http://stackoverflow.com/questions/3261037/3261819#3261819。 – 2010-07-16 04:36:18