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 变量查询的主要内容,如果未能解决你的问题,请参考以下文章