gpt4 book ai didi

c# - linq-to-sql获取序列包含多个元素

转载 作者:行者123 更新时间:2023-11-30 22:29:42 26 4
gpt4 key购买 nike

我有一个看起来像这样的查询:它以 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>(其中 Tkeyl.Status 的类型,Telml 的类型)。

我认为您对分组运算符的使用感到困惑。

我猜你想得到的是:

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 .

edit 查询中,完成了一个返回表{ { 1, CountOnes}, {2, CountTwos } } 的查询。 .其他行只是将结果(项目集)转换为具有某些对象作为属性的单个对象,并在这两个值上物理完成。

关于c# - linq-to-sql获取序列包含多个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10063569/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com