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可以做到这一点,但这看起来会很慢而且很混乱,特别是如果我需要对多列进行分组以便不排除太多行.有任何想法吗?谢谢.
不,您不能指定用于确定相等性的投影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中会是什么样子 - 但你应该通过日志记录检查,然后运行查询分析器来查看成本是多少.
| 归档时间: |
|
| 查看次数: |
3391 次 |
| 最近记录: |