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分组。
任何想法?
首先,创建嵌套查询:
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()
执行对象级比较(两个实例是否相同)而不是值级比较(它们是否具有相同的值)。