Linq查询嵌套选择+不同

时间:2015-07-31 21:16:43

标签: c# asp.net asp.net-mvc linq entity-framework

我很难将此查询转换为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分组。

有什么想法吗?

2 个答案:

答案 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)

您必须实施IComparableIComparer或传递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()执行对象级比较(两个实例是同一个实例)而不是值级别比较(它们是否具有相同的值)。