我正在尝试将一些内联工作作为语句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首先内联工作。
注意:我知道代码示例是多余的,但我正在寻找基本概念。如果它可行,我将扩展它。
答案 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;
});