Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将语句Lambda放入LINQ查询时遇到问题_C#_.net_Linq_Lambda_Datacontext - Fatal编程技术网

C# 将语句Lambda放入LINQ查询时遇到问题

C# 将语句Lambda放入LINQ查询时遇到问题,c#,.net,linq,lambda,datacontext,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 belo

我试图将一些内联工作作为语句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方法名 预期文件为.cs 166 27 MigrationCore

。。。不过,我也同样乐意看到Lambda表达式首先内联工作


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

查询语法需要一个方法引用-它不接受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对象。要将它与LINQ To SQL查询一起使用,在调用
Select()
之前需要调用
AsEnumerable()

注释

实际上,您不需要select中的
结构。对于本例,下面的代码片段(AFAICT)是相同的,但为了与前面的示例相似,并说明它的工作原理,我将其保留在上面。第二个代码段将这两条语句拆分为单独的行,结果也相同

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

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

要执行内联工作,需要使用两个步骤:1)使用有效的
select
表达式获取SQL数据,然后2)使用LINQ To对象将该数据作为IEnumerable进行内联工作。可能看起来像这样:

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

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

错误告诉您编译器将此视为函数调用,如果删除后面的括号会发生什么情况?@Kjartan:删除parens会导致错误:
select子句中的表达式类型不正确。调用“Select”时类型推断失败。
您的qPeople3语句给了我CSC 3.5编译错误:
带有语句体的lambda表达式无法转换为表达式树
实际上这些表达式都没有编译-它们都给出了上述编译错误。现在我意识到您可能没有在源代码。正如这里回答的那样,需要一个可计算的
。我只使用LINQtoObjects测试了它,而不是LINQtoSQL。我的错。AsEnumerable()调用将其从IQueryable更改为IEnumerable。我将在我的回答中添加一个附录,以防人们不读这些评论(我对dahlbyk的回答投了赞成票,因为他发现了我的遗漏)。这澄清了我的情况。我很高兴您看到了用于SQL的DataContext。我运行了代码,效果很好。谢谢
var qPeople1 = from ME.tblPeople person in mcontext.tblPeoples
              select person;

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