何时更喜欢用SelectMany()表示的连接超过Linq中用join关键字表示的连接

Nic*_*ico 8 linq join

Linq允许通过使用join关键字或使用带有where关键字的SelectMany()(即几个来自关键字)来表达内部联接:

var personsToState = from person in persons
                     join state in statesOfUS
                     on person.State equals state.USPS
                     select new { person, State = state.Name };
foreach (var item in personsToState)
{
    System.Diagnostics.Debug.WriteLine(item);
}

// The same query can be expressed with the query operator SelectMany(), which is
// expressed as two from clauses and a single where clause connecting the sequences.                     
var personsToState2 = from person in persons
                      from state in statesOfUS
                      where person.State == state.USPS
                      select new { person, State = state.Name };
foreach (var item in personsToState2)
{
    System.Diagnostics.Debug.WriteLine(item);
}
Run Code Online (Sandbox Code Playgroud)

我的问题:何时使用join-style以及何时使用where-style,与其他样式相比,是否具有一种样式性能优势?

Ahm*_*eed 6

Join由于Athari提到的键控查找,本地查询更有效,但是对于LINQ to SQL(L2S),您将获得更多的里程数SelectMany.在L2S中,SelectMany最终在生成的SQL中使用某种类型的SQL连接,具体取决于您的查询.

看看C#4.0 In Nutshell的作者Joseph/Ben Albahari 在LINQ测验中的问题11和12 .它们显示了不同类型连接的样本,并指出:

使用LINQ to SQL,基于SelectMany的连接是最灵活的,并且可以执行equi和非equi连接.抛出DefaultIfEmpty,你也可以做左外连接!

此外,Matt Warren在这个主题上有一篇关于IQueryable/ SQL 的详细博客文章:LINQ:构建一个IQueryable提供者 - 第七部分.

回到你要使用的问题,你应该使用更具可读性的查询,让你轻松表达自己并清楚地构建你的最终目标.除非您正在处理大型集合并且已经描述了这两种方法,否则性能不应该是最初的关注点.在L2S中,您必须考虑灵活性SelectMany,这取决于您配置数据所需的方式.