LINQ-Entities Group By With Range 变量查询

Posted

技术标签:

【中文标题】LINQ-Entities Group By With Range 变量查询【英文标题】:LINQ-Entities Group By With Range Variable Query 【发布时间】:2012-09-11 11:37:08 【问题描述】:

这是我正在尝试将其转换为 LINQ 实体查询的 T-SQL....

SELECT  [a].[ModLimit], [b].[NumberOfMods]
FROM    [dbo].[Site][a]
INNER JOIN
(
    SELECT          [SiteId], ISNULL(COUNT(*),0) AS [NumberOfMods]
    FROM            [dbo].[Users][a]
    WHERE           [a].[IsMod] = 1
    GROUP BY        [SiteId]
) [b] ON [a].[SiteId] = [b].[SiteId]
WHERE   [a].[SiteId] = 1

到目前为止我正在使用的东西(不是编译...)

from u in db.Set<User>()
join s in db.Set<Site>() on u.SiteId equals s.SiteId
let x = t.ModLimit
where s.SiteId == 1
group u by u.SiteId into g
select new  g,x);

想法?

表格的缩减结构:

网站

SiteId int PK

ModLimit int

用户

UserId int PK

SiteId int FK IsMod

【问题讨论】:

当每个分组的站点 ID (g) 的 ModLimit (x) 可能不同时,您是否尝试将 g 和 x 选择到同一个对象中? 可能是它无法编译的原因之一。据我所知,lambda 没有“let”关键字。 ***.com/questions/9240375/… 不知道ModLimit是哪里来的? @LadislavMrnka - 已编辑。 ModLimit 来自[Site] 表。 错误是:“无法解析符号'x'” 【参考方案1】:

这是我迄今为止最好的尝试(您能否提供 dbo.site 和 dbo.users 的结构以及您期望输入的一些测试数据?)

            List<User> users = new List<User>();
            users.Add(new User()  SiteId = 0, IsMod = 1, ModLimit = 3 );
            users.Add(new User()  SiteId = 1, IsMod = null, ModLimit = 2 );
            users.Add(new User()  SiteId = 1, IsMod = 1, ModLimit = 2 );
            users.Add(new User()  SiteId = 1, IsMod = 1, ModLimit = 2 );

            var innerSelect = users
                    .Where(o => o.IsMod != null && o.IsMod > 0)
                    .GroupBy(o => o.SiteId)
                    .Select(o => new User
                     
                         SiteId = o.Key,
                         Counter = o.Count()
                     )
                     .ToList();

            var result = (from u in users
                          join s in innerSelect on u.SiteId equals s.SiteId
                          where u.SiteId == 1
                          select new
                          
                              u.ModLimit,
                              NumberOfMods = s.Counter
                          )
                          .Distinct()
                          .ToList();

【讨论】:

这不是两个查询吗?记住这是一个 LINQ 实体查询,所以它是针对数据库的。

以上是关于LINQ-Entities Group By With Range 变量查询的主要内容,如果未能解决你的问题,请参考以下文章

如何使用group by 分组查询表中所有字段信息

高级分组group by group by cube group by rollup 使用说明

mysql 可以group by 两个字段吗

sql中得group by 用法?

only_full_group_by报错

SQL多次分组问题 group by