当不使用.Distinct()时,Linq查询返回重复的结果 - 为什么?

时间:2013-02-19 20:46:26

标签: linq

当我在LinqPad中使用以下Linq查询时,我得到了25个结果:

var result = (from l in LandlordPreferences
          where l.Name == "Wants Student" && l.IsSelected == true
          join t in Tenants on l.IsSelected equals t.IsStudent
          select new { Tenant = t});
result.Dump();

当我将.Distinct()添加到最后时,我只返回了5个结果,所以,我猜我在使用上面的结果时会得到每个结果的5个实例。

我是Linq的新手,所以我想知道这是否是因为构建不良的查询?或者这是Linq总是表现的方式?当然不是 - 如果我用.Distinct()返回500行,这是否意味着没有它返回2,500行?这会影响性能吗?

1 个答案:

答案 0 :(得分:3)

这是一个构建不良的查询 您将LandlordPreferencesTenants一起加入布尔值而不是外键。 所以,最有可能的是,你有5个选定的土地领主和5个学生的租户。每位学生将返回每位土地领主:5 x 5 = 25.这是一个cartesian product,与LINQ无关。 SQL中的类似查询行为相同。

如果你要将土地领主添加到你的结果(select new { Tenant = t, Landlord = l }),你会发现没有两个结果实际上是相同的。

如果您无法以某种方式修复查询,Distinct是您唯一的选择。