C#:是否可以在匿名方法中声明局部变量?

2024-04-05

匿名 C# 方法中可以有局部变量,即在下面的代码中我只想执行一次计数。

IQueryable<Enquiry> linq = db.Enquiries;

if(...) linq = linq.Where(...);

if(...) linq = linq.Where(e => 
    (x <= (from p in db.Orders where p.EnquiryId == e.Id select p).Count() && 
        (from p in db.Orders where p.EnquiryId == e.Id select p).Count() <= y));

if(...) linq = linq.Where(...);

var result = (from e in linq select e);

匿名函数有“let”吗?

更新: 请注意,我在此语句后添加了几个Where 子句,因此我无法通过选择来关闭。

/Niels


是的,为什么不?!毕竟它是一个函数,只是匿名的!

Example:

 x => { int y = x + 1; return x + y; }

或者:

 delegate(int x) {
     int y = x + 1;
     return x + y;
 }

所以你的代码可以写成:

  ... = linq.Where(e => {
         var count = (from p in db.Orders where p.EnquiryId == e.Id select p).Count();
         return x <= count && count <= y;
  });

更新:为了澄清有关注释的内容,了解匿名方法和 lambda 表达式之间的区别很重要。匿名方法就像普通方法一样,没有显式名称。当你编译它时,编译器会为你生成一个具有奇怪名称的普通方法,因此它不会有任何特殊限制。然而,匿名方法的一种表示形式是 lambda 表达式。 Lambda 表达式可以用几种不同的方式解释。第一个是代表。这样,它们就相当于匿名方法。第二个是表达式树。这种方式通常由 LINQ to SQL 和其他一些 LINQ 提供程序使用。他们不会以任何方式直接执行你的表达式。他们将其解析为表达式树,并使用该树作为输入数据来生成要在服务器上运行的等效 SQL 语句。它不像方法一样执行,也不被视为匿名方法。在这种情况下,您无法定义局部变量,因为无法将 lambda 解析为表达式树。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#:是否可以在匿名方法中声明局部变量? 的相关文章

随机推荐