如果我的查询/结果设置如下......
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
执行.Distinct()将返回所有3条记录,但如果我想要第一条和第三条记录并且不想从结果集中删除任何列,该怎么办?有没有办法在做一个不同的时候指定要忽略的列,或者明确地包含在一个不同的列中,以便我可以做这样的事情......
// pseudo code
.Distinct(o => o.Name.FirstOrDefault())
我认为使用group by可以做到这一点,但这似乎会很慢而且很混乱,特别是如果我需要在多个列上进行分组以便不排除太多行。有任何想法吗?感谢。
答案 0 :(得分: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
};
请注意,这可能不是确定性的结果 - 您正在取每组的第一项,忽略排名 - 因此您可能会获得排名为876的记录,或者您可能会在示例中获得排名为755的记录
我不确切知道这在SQL中会是什么样子 - 但您应该通过日志记录检查,然后运行查询分析器以查看成本是多少。