无法将Statement Lambda放在LINQ查询中

时间:2010-07-16 00:15:41

标签: c# .net linq lambda datacontext

我正在尝试将一些内联工作作为语句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方法名称   预期的file.cs 166 27 MigrationCore

...但是我也同样很高兴看到Expression Lambda首先内联工作。

注意:我知道代码示例是多余的,但我正在寻找基本概念。如果它可行,我将扩展它。

2 个答案:

答案 0 :(得分: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 to Objects。要在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; });

答案 1 :(得分:4)

有两种lambda表达式:匿名委托和表达式树。 LINQ to Objects使用前一种类型,并允许任何有效的匿名方法体。后一种类型由LINQ to SQL使用,并要求其主体为单个表达式。然后将此表达式传递到L2SQL运行时并操作到发送到服务器的SQL中。

要执行内联工作,您需要使用两个步骤:1)获取具有有效select表达式的SQL数据,然后2)将该数据操作为IEnumerable&lt;&gt;使用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; 
               });