我很难将此查询转换为LINQ。
select fk, count(*)
from (
select distinct fk, attribute1, attribute2
from table
) a
group by fk
having count(*) > X
我需要fk,attr1,attr2的每个不同组合,只有在fk大于x(参数)的情况下才按fk分组。
有什么想法吗?
答案 0 :(得分:2)
首先,创建嵌套查询:
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();
答案 1 :(得分:1)
您必须实施IComparable
,IComparer
或传递IEqualityComparer
或其他一些方式以确保Distinct()
适用于您的班级属性,但这是必不可少的linq :
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()
执行对象级比较(两个实例是同一个实例)而不是值级别比较(它们是否具有相同的值)。