LINQ 的“Where”方法如何工作?

kof*_*cii 3 c# linq

LINQ 的“where”方法到底是如何定义的?我猜实现是这样的:

public static IEnumerable<T> Where ( this partialParent, Func<bla,bla> myDelegate ) 
Run Code Online (Sandbox Code Playgroud)

现在,如果我像这样调用Where方法:

from c in context.Con
where ( c.Col1 == c.Col2 )
select c
Run Code Online (Sandbox Code Playgroud)

我猜"c.Col1 == c.Col2"是传递下来并且某个foreach循环进行检查。但是当我像这样调用 where 时发生了什么:

where ( c.Col1 == c.Col2 || c.Col3 == c.Col4 )
Run Code Online (Sandbox Code Playgroud)

这两个“检查”是否作为一个整体表达式传递下来?也许我错过了一些非常简单的事情。

Jon*_*nna 5

对于 linq-to-objects,您可以将其视为等效于enumeration.Where(c => c.Col1 == c.Col2)or enuemration.Where(c => c.Col1 == c.Col2 || c.Col3 == c.Col4)

最简单的实施方法Where如下:

public static IEnumerable<T> Where<T>(this IEnumerable<T> src, Func<T, bool> pred)
{
  foreach(T item in src)
    if(pred(item))
      yield return item;
}
Run Code Online (Sandbox Code Playgroud)

不过,如果您查看反射器中的代码,您会发现这个基本想法有很多优化。

然而,这种调用Where只是where可以实现的一种方式。由于 LINQ 查询可以针对许多不同的可查询源执行,因此还有其他可能性。例如,它可以转换WHERE为发送到数据库的查询的 SQL 子句。使用 Linq2SQL 执行一些查询、运行 SQL 探查器并查看发送到服务器的内容可以提供丰富的信息。