在LINQ to SQL中对主键使用Distinct

本文关键字:Distinct LINQ to SQL | 更新日期: 2023-09-27 18:04:19

我有一个使用标签对内容进行分类的系统,类似于Stack Overflow的方式。我正在尝试使用LINQ to SQL生成最近使用的标签列表。

(from x in cm.ContentTags
    join t in cm.Tags on x.TagID equals t.TagID
    orderby x.ContentItem.Date descending select t)
    .Distinct(p => p.TagID) // <-- Ideally I'd be able to do this

Tags表与ContentItems表有多对多的关系。ContentTags将它们连接起来,每个元组都有一个对Tag和ContentItem的引用。

我不能只使用distinct,因为它比较tableame。*而不是Tablename。PrimaryKey,我不能实现一个IEqualityComparer,因为它不转化为SQL,我不想从数据库中拉出潜在的数百万条记录与。tolist()。那么,我该怎么办呢?

在LINQ to SQL中对主键使用Distinct

您可以编写自己的查询提供程序,它支持这种重载的distinct操作符。它并不便宜,但它可能是值得的,特别是如果您可以使它的查询生成可组合。这将使许多定制成为可能。

否则,您可以创建一个存储过程或视图

使用子select:

var result = from t in cm.Tags
             where(
                   from x in cm.ContentTags
                   where x.TagID == t.TagID
                  ).Contains(t.TagID)
             select t;

这将意味着只从cm返回不同的记录。标签,唯一的问题是你需要找到一些方法来订购result

使用说明:

.GroupBy(x => x.TagID)

,然后提取数据:

Select(x => x.First().Example)