Linq to Sql:选择不同的行,同时忽略指定的列

Str*_*ped 4 group-by distinct linq-to-sql

如果我有一个查询/结果集如下...

from t1 in table1
join t2 in table2 on t1.ID equals t2.ID
join t3 in table3 on t2.ID equals t3.ID
select new MyClass()
{
   ID = t1.ID,
   Name = t2.Name,
   Rank = t2.Rank,
   City = t3.City
}

ID | Name | City | Rank
01 | Test | Fake | 876
01 | Test | Fake | 755
02 | Blah | Fake | 765
Run Code Online (Sandbox Code Playgroud)

执行.Distinct()将返回所有3条记录,但如果我想要第一条和第三条记录并且不想从结果集中删除任何列,该怎么办?有没有办法在执行distinct时指定要忽略的列,或者明确包含在distinct中以便我可以执行类似的操作...

// pseudo code
.Distinct(o => o.Name.FirstOrDefault())
Run Code Online (Sandbox Code Playgroud)

我认为使用group by可以做到这一点,但这看起来会很慢而且很混乱,特别是如果我需要对多列进行分组以便不排除太多行.有任何想法吗?谢谢.

Jon*_*eet 5

不,您不能指定用于确定相等性的投影Distinct.(我有LINQ to Objects的扩展方法,但这是另一回事.)

我建议你使用GroupBy,可能与First:

var query = from t1 in table1
            join t2 in table2 on t1.ID equals t2.ID
            join t3 in table3 on t2.ID equals t3.ID
            select new { t1.ID, t2.Name, t2.Rank, t3.City } into tuple
            group tuple by new { tuple.ID, tuple.Name, tuple.City } into grouping
            let first = grouping.First() // For convenience
            select new MyClass
            {
                ID = first.ID, City = first.City,
                Name = first.Name, Rank = first.Rank
            };
Run Code Online (Sandbox Code Playgroud)

请注意,这可能不是确定性的结果 - 您正在取每组的第一项,忽略排名 - 因此您可能获得排名为876的记录,或者您可能在示例中获得排名为755的记录.

我不确切地知道这在SQL中会是什么样子 - 但你应该通过日志记录检查,然后运行查询分析器来查看成本是多少.