2016-07-06 55 views
0

我想为我的仪表板中的某个仪表板编写一个LINQ查询,它根据某些条件检索数据。我想根据表格中可用的不同状态显示记录计数。LINQ虚拟(预定义)列分组

以下是我试图转换成Linq的SQL查询。

select count(id) cnt, 'Available' label from table where date = sysdate 

以上查询返回结果在DB IDE下面。这是我想要linq的结果

cnt label 
0  Available 

我试着用下面的linq查询,但它返回0计数,因此结果没有被检索。

var data = (from a in context 
where a.date = System.DateTime.Now 
group a in a.id into g 
select new { 
cnt = g.Count(), 
label = 'Available' 
}).ToList(); 

如何在linq中达到上述结果。您的帮助将不胜感激。

感谢

-------------编辑---------------- 更新LINQ查询

var data = (from a in context.TableA 
where a.id = uniqueID 
group a in a.id into g 
select new { 
cnt = g.Count(), 
label = 'Available' 
}).Concat(from a in context.TableB 
where a.id = uniqueID 
group a in a.id into g 
select new { 
cnt = g.Count(), 
label = 'WIP' 
}).ToList(); 
+1

您的SQL查询中没有where子句,但是在您的Linq中执行,并且我怀疑您的表日期列与当前的DateTime.Now(我可以保证它不是)相同。从你的linq中删除'where'。 – Dispersia

+0

您想计算具有特定ID的数据中元素的数量,还是要统计数据中唯一ID的数量? –

+0

@Dispersia - 我已经更新了SQL查询。请参阅更新的一个。尽管如此,它仍然在DB IDE中返回1行,但不会与linq一起返回。仅供参考,我需要这个条件来过滤结果。谢谢 – user968441

回答

2

要计算在LINQ查询匹配谓词元件的数量简单地用where子句:

var results = 
    from a in context 
    where a.date.Date == DateTime.Now.Date 
     && a.id == someIdHere 
    select a; 

var data = new { 
    count = results.Count(), 
    label = "Available" 
}; 

或者,在扩展方法的语法(我喜欢):

var results = context.Where(a => a.date.Date == DateTime.Now.Date && a.id == someIdHere); 

var data = new { 
    count = results.Count(), 
    label = "Available" 
}; 

比较关于什么样的结果,你希望有一个DateTime对象时也要小心;将DateTime.Now与日期进行比较将会返回false,因为它也会比较时间码,所以使用DateTime.Date属性仅为了比较的目的从对象中获取日期。

+0

感谢您的回复。看看LINQ和lambda表达式,它应该像预期的那样工作,但是我们不能把它放在单个查询中。实际上,我在linq中使用了'Concat'扩展方法来获得基于不同标签的结果,因此我尝试使用单个linq来计算基于不同标签的记录数。 – user968441

+0

这可能是可能的,但我会通过将所有内容强制为一个查询来避免复杂的事情;在我的经验中,将所有内容放入大型报表的愿望只会导致无法维护的代码。如果它回答你的问题,请记住标记为答案。 –

+0

是的,我知道它可能是一个复杂的LINQ,但不是有多个数据库行程,我建议有一个单一的查询,根据建议检索整个数据,因此有这种方法。如果我们将聚合逻辑与LINQ结合起来,我不会同意“不可维护的代码”。这取决于您正在尝试管理的编写linq和逻辑的方式。看到我用“Concat”声明更新了我的问题。谢谢 – user968441