这是根据是否有一些匹配的ID来返回布尔值。IQueryable.Where()实际发生了什么?
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 运算符的左侧指定输入 参数(如果有的话),并且右侧 包含表达式或语句 块。 lambda表达式x => x * x被读取为“x转到x次x”。
所以怎么了,我想明白了什么我的代码意味着在此基础上,.Where(s
“变为” s.BundleID == t.BundleID
...),所以这里发生了什么? “去”是什么意思?是否将s
中的每个ID与t
中的每个ID进行比较?我怎么理解为什么它被称为“去”和究竟发生了什么?
然后它变得更加扑朔迷离......
=>运算符具有相同的优先级 如赋值(=),是 右结合。
Lambdas用于基于方法的LINQ 查询作为标准查询的参数 运算符方法(如Where)。
当您使用基于方法的语法来调用 Where方法在 枚举类(如你在LINQ做 对象和LINQ to XML)的参数 是委托类型System.Func。拉姆达表达式是创建 委托的最方便的方式。
什么是代表类型System.Func<T, TResult>
以及它是如何使用此“去”运算符创建的?
我不能只是使用代码,因为我知道它的工作,我需要了解如何/为什么。
如果您真的只需要一个true或false,那么使用Any函数而不是where + count可能更有效?一旦一个项目为真,db.SaveTrackings.Any(相同的谓词)将立即返回true。 – 2010-08-18 16:03:08
@John谢谢,如果我只能理解这个整个委托/ lambda事件发生了什么,试图让我的头在 – BigOmega 2010-08-18 18:01:44
位,它会花一点时间,然后它只会“点击”。最简单的方法就是将它们视为没有名字的迷你函数。语法可能会有点奇怪,特别是没有参数...()=> {等等等等等等等等等等等等。 WTH是那样的!:D – 2010-08-19 15:54:36