LinQ-to-SQL 获取序列包含多个元素
本文关键字:元素 包含多 获取 LinQ-to-SQL | 更新日期: 2023-09-27 18:30:28
>我有一个看起来像这样的查询:它接受一个ID(ThelistOfIDs)列表作为参数,我正在分组计数。
var TheCounter = (from l in MyDC.SomeTable
where ThelistOfIDs.Contains(l.ID)
group l by l.Status into groups
select new Counter()
{
CountOnes = (from g in groups
where g.Status == 1
select g).Count(),
CountTwos = (from g in groups
where g.Status == 2
select g).Count(),
}).Single();
基本上,我不明白为什么我会收到错误。我不想从数据库中带回 entore 集合并在 linq-to-object 中进行计数;我想在数据库中进行计数并带回结果。
将您的查询放入我的 IDE 或使用 C# 编译,但我想问题是 查询中的groups
是IGrouping<Tkey, Telm>
而不是IQueryable<Tkey>
(其中Tkey
是l.Status
类型,Telm
是l
类型)。
我想您对分组运算符的使用感到困惑。
我想你想得到的是:
var queryByStatus = from l in MyDC.SomeTable
where ThelistOfIDs.Contains(l.ID)
group l by l.Status;
var counter = new Counter()
{
CountOnes = queryByStatus.Where(l => l.Key == 1).Count(),
CountTwos = queryByStatus.Where(l => l.Key == 2).Count(),
};
编辑:
替代查询,为了获得相同的结果,将数据库上的所有操作移动到原始查询中,以便仅查询一次数据库。
var queryCountByStatus = from l in MyDC.SomeTable
where ThelistOfIDs.Contains(l.ID)
group l by l.Status into r
select new { status = r.Key, count = r.Count() };
var countByStatus = queryCountByStatus.ToList();
var counter = new Counter()
{
CountOnes = countByStatus.FirstOrDefault(l => l.status == 1).count,
CountTwos = countByStatus.FirstOrDefault(l => l.status == 2).count,
};
注意:
我的编辑部分中的查询仅查询数据库一次,并返回映射Status
-> Count
。
请注意,在我的原始查询中,只需要两次对 DB 的调用 - 两者都返回一个数字 - 一个用于CountOnes
,一个用于CountTwos
。
在编辑查询中,执行一个查询,该查询返回表{ { 1, CountOnes}, {2, CountTwos } }
。其他行只是将结果(一组项目)转换为具有某些对象作为属性的单个对象,并在这两个值上物理完成。
您按状态分组,然后从该组投影 - 但每个唯一状态(===组)仍将有一行。
所以:我建议你没有一个独特的状态。
这可能是您正在寻找的...
(这是我的用户表,但应该是一样的)
var statuscounts = (from u in db.Users
where u.UserStatus > 0
group u by u.UserStatus into groups
select new { Status = groups.Key, Count = groups.Count() });
// do this to iterate and pump into a Counter at will
foreach (var g in statuscounts)
Console.WriteLine("{0}, {1}", g.Status, g.Count);
。甚至类似的东西...
var counter = statuscounts.AsEnumerable()
.Aggregate(new Counter(), (c, a) => {
switch (a.Status)
{
case 1: c.CountOfOnes = a.Count; return c;
case 2: c.CountOfTwos = a.Count; return c;
case 3: c.CountOfThrees = a.Count; return c;
default: c.CountOfOthers = a.Count; return c;
}});
。要点是,如果您已经分组,则应使用分组结果,它属于 IGrouping<out TKey, out TElement>
类型,其中键是您的状态,它是IEnumerable<>
或您的记录。
希望这有帮助