【发布时间】:2011-03-31 15:34:10
【问题描述】:
这是根据是否有一些匹配的 ID 返回一个布尔值。
from t in getAll
select new Result
{
...
bool DetailsAvailable =
(db.SaveTrackings.Where(s => s.BundleID == t.bundleID
&& s.UserID == t.userID)
.Count() > 0) ? true : false;
}
这就是我认为可以理解的:.Where() 正在返回所有具有匹配 ID 的条目,然后 .Count() 只是查看有多少条目。我只觉得我理解了我们需要s 的目的。
我知道这段代码会发生什么,因为它一直在使用我只是不明白它是如何工作的,而且 MSDN 的一些文档使用了一些让我感到困惑的术语。
所有 lambda 表达式都使用 lambda operator =>,读作“goes” to"。lambda 的左侧 运算符指定输入 参数(如果有)和右侧 持有表达式或语句 堵塞。 lambda 表达式 x => x * x 读作“x 乘以 x”。
那么我想如何理解我的代码基于此的含义,.Where(s“转到”s.BundleID == t.BundleID...) 那么这里发生了什么? “去”是什么意思?是否将s 中的每个ID 与t 中可用的每个ID 进行比较?我如何理解为什么它被称为“去”以及到底发生了什么?
然后它变得更加混乱......
=> 运算符具有相同的 优先级作为赋值 (=) 并且是 右结合。
Lambda 用于基于方法的 LINQ 查询作为标准查询的参数 运算符方法,例如 Where。
当你使用基于方法的语法来 调用 Where 方法 可枚举类(就像您在 LINQ 中所做的那样 对象和 LINQ to XML) 参数 是委托类型 System.Func。一个 lambda 表达式是 最方便的创建方法 委托。
什么是委托类型System.Func<T, TResult>,它是如何使用“goes to”运算符创建的?
我不能只使用代码,因为我知道它正在工作,我需要了解如何/为什么。
【问题讨论】:
-
如果你真的只需要一个真或假,使用Any函数而不是where+count可能更有效?只要一项为真,db.SaveTrackings.Any(same predicate) 就会返回真。
-
@John 谢谢,如果我能理解这整个委托/lambda 的事情发生了什么,试图让我的头脑了解这些问题
-
这需要一点时间,然后它就会“点击”。最简单的方法是将它们视为没有名称的迷你函数。语法可能有点奇怪,尤其是没有 args... () => { blah blah blah } 第一次得到所有人。那是什么! :D
标签: c# delegates lambda iqueryable