Linq查询嵌套select + distinct

本文关键字:distinct select 嵌套 查询 Linq | 更新日期: 2023-09-27 18:05:44

我很难把这个查询转换成LINQ。

select fk, count(*)
from (
    select distinct fk, attribute1, attribute2
    from table
) a
group by fk
having count(*) > X

我需要fk, attr1, attr2的每一个不同的组合,仅当count大于x(参数)时,由fk分组。

任何想法?

Linq查询嵌套select + distinct

首先,创建嵌套查询:

var query= db.Table.Select(e=>new {e.FK, e.Attribute1, e.Attribute2}).Distinct();

之后,你可以这样做:

int x=10;
var result= from e in query
            group e by e.FK into g
            let count=g.Count()
            where count>x
            select new{FK=g.Key, Count=count};

当你调用,例如,ToList方法,是当这些查询将对你的数据库执行,结果元素将被加载到内存。

var elements=result.ToList();

合并所有,你也可以这样做:

int x=10;
var elements=(from e in db.Table.Select(e=>new {e.FK, e.Attribute1, e.Attribute2}).Distinct()
             group e by e.FK into g
             let count=g.Count()
             where count>x
             select new{FK=g.Key, Count=count}).ToList();

你必须实现IComparable, IComparer或通过IEqualityComparer或其他方式来确保Distinct()在你的类的属性中工作,但这里是基本的联系:

var result = (from t in tableList.Select(t => new { fk, attr1, attr2 }).Distinct()
              group t by t.fk into g
              select new { fk = g.Key, Count = g.Count() })
             .Where(t => t.Count > X)
             .ToList();

使用匿名类型作为'select fk, attribute1, attribute2'的等价,但这可能会使实现Distinct()变得更加困难。

默认情况下,Distinct()执行对象级比较(两个实例是否相同)而不是值级比较(它们是否具有相同的值)。