Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Linq中,何时更喜欢使用SelectMany()表示的联接而不是使用join关键字表示的联接_Linq_Join - Fatal编程技术网

在Linq中,何时更喜欢使用SelectMany()表示的联接而不是使用join关键字表示的联接

在Linq中,何时更喜欢使用SelectMany()表示的联接而不是使用join关键字表示的联接,linq,join,Linq,Join,Linq允许通过使用join关键字或使用 使用where关键字选择many()(即从关键字中选择几个): var personsToState = from person in persons join state in statesOfUS on person.State equals state.USPS select new { person, State = st

Linq允许通过使用join关键字或使用 使用where关键字选择many()(即从关键字中选择几个):

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);
}
我的问题:何时有目的地使用连接样式,何时使用where样式,
一种样式的性能优于另一种样式?

联接效率更高,它使用查找类(字典的一种变体,一个键有多个值)查找匹配值。

对于本地查询
联接
效率更高,因为其键控查找为,但是对于LINQ to SQL(L2S)通过
选择many
,您将获得更多里程数。在L2S中,a
SelectMany
最终会根据您的查询在生成的SQL中使用某种类型的SQL联接

简而言之,看看C#4.0的作者Joseph/Ben Albahari提出的问题11和12。它们显示不同类型联接的示例,并说明:

使用LINQ to SQL,选择基于多个 联接是最灵活的,并且可以 执行等联接和非等联接。 输入DefaultIfEmpty,您就可以 也要做左外连接

此外,Matt Warren在这个主题上有一篇详细的博客文章,因为它与
IQueryable
/SQL有关,请点击此处:


回到要使用哪种查询的问题,您应该使用更具可读性的查询,并允许您轻松地表达自己和清楚地构建最终目标。性能不应该是一个最初的问题,除非您正在处理大型集合,并且已经分析了这两种方法。在L2S中,你必须考虑灵活性<代码> SelectMany < /代码>根据你需要配对数据的方式提供给你。

@ Thomas Levesque谢谢你的更正,英语不是我的母语。